Похоже, что многое, но на самом деле это просто перестановка нескольких стандартных компонентов. Большинство действий будет состоять из изменений внутренних свойств и некоторых косметических средств, которые будут отображаться на клиенте, и существует всего несколько различных способов сделать это.
Вам нужно что-то вроде следующего:
- стандартный способ отправки действий на сервер, который позволяет удобно извлекать произвольные параметры (поскольку каждое действие может иметь несколько очень специфических аргументов)
- тип сообщения от сервера к клиентам, чтобы начать воспроизведение указанной анимации на указанном корабле
- тип сообщения от сервера к клиентам, увеличивающий значение здоровья на корабле
Тогда ваш серверный код для упомянутого вами действия выглядит следующим образом:
if (message.type == REPAIR)
{
repairer = message.actor;
repaired = message.target;
// Insert verification code here to check that the 2 ships are close enough,
// that the repairer is entitled to perform this action, etc
// Verification has passed: do the work
broadcastToAllClients(new Message(type=PLAY_ANIM, target=repairer, value=REPAIR_CASTED));
broadcastToAllClients(new Message(type=CHANGE_PROPERTY, target=repaired, proerty=HEALTH, value=5)); // 5 is the amount
broadcastToAllClients(new Message(type=PLAY_ANIM, target=repaired, value=BEING_REPAIRED));
}
Это очень легко распространить на любое количество действий, и просто потребуется несколько дополнительных типов сообщений, чтобы приспособиться к различным вещам, которые могут изменяться или отображаться.