Задача была в методе
OnActorCreated сохранить все созданные акторы в заранее созданные списки. Актор добавляется в список только если номер подмиссии совпадает с тем, что получен при помощи
GamePlay.gpNextMissionNumber(). Потом этими списками легко управлять: удалять акторы, заново создавать и т.п.
Далее необходимо было удалить все созданные акторы из одного из таких списков, создать новые и также добавить по номеру подмиссии в этот же список. Аналогично третья чистка/замена
В игре выглядит так - город сначала имеет обычное зенитное прикрытие. Как только его выбирают для штурма - все зенитки удаляются и загружается усиленный набор зениток. Штурм закончился, снова загрузился первоначальный набор зениток. Это работает и вполне нормально.
Однако сначала я не заметил баг, но потом попались на глаза зенитки синие и красные в одной точке, так как удаление акторов не происходило из-за неправильно определенного номера подмиссии. Разница была в единицу.
- Т.е. первая загрузка зениток - номер определен неверно, на единицу меньше
- Вторая и третья, уже во время миссии - номер в
GamePlay.gpNextMissionNumber() верный
Тут еще особенность, точнее две. В миссии используется наследование от миссии командера. И вторая - первоначально загрузка зениток происходила до Inited(), примерно так:
Код:
public class Mission : RSTMission
{
MissionBOR Data = MissionBOR.GetInstance; // Get MissionSMP class
public override void Inited()
{
SendMessage.ToServer("[TEST] Номер подмиссии - [{0}]", GamePlay.gpNextMissionNumber());
GamePlay.gpPostMissionLoad("missions\\SMP\\Battle\\submission\\destroyAI.mis");
}
}
В этом Data в методе создания зениток правильный номер подмиссии определялся только если прибавить к нему единицу(так как на этот момент
GamePlay.gpNextMissionNumber() равен нулю, т.е. номеру хост-миссии):
Код:
public void SetAAA()
{
AAAMisNumber = GamePlay.gpNextMissionNumber() + 1;
SMPLibrary.LoadSubmission(BORLibrary.CreateAAArtilleryByTemplate(mapFile, this.Army, 0.2));
SendMessage.ToServer("[SERVER]: Номер подмиссии ААА гарнизона [{0}] - [{1}]", Name, AAAMisNumber);
}
Однако если потом в методе
OnTickGame(к примеру) удалить акторы-зенитки и создать новые методом
SetAAA(), то к номеру подмиссии уже не нужно прибавлять единицу, а если прибавить - то новые акторы не попадут в список через метод
OnActorCreated
Код:
public void SetAAA()
{
AAAMisNumber = GamePlay.gpNextMissionNumber();
SMPLibrary.LoadSubmission(BORLibrary.CreateAAArtilleryByTemplate(mapFile, this.Army, 0.2));
}
Позже я вынес первое создание акторов в
OnTickGame, номера стали совпадать.
Т.е. сейчас так выглядит:
Код:
[15:19:09] 35>difficulty Vulnerability 1
[15:19:09] 36>difficulty WindTurbulence 1
[15:19:09] 37>missLoad missions\SMP\Battle\battle.mis
[15:19:19] 38>[15:19:19] Loading mission ...
[15:19:19] Server to [Server]: ......................
[15:19:19] Server to [Server]: [SERVER]: Инициализация миссии...ok
[15:19:20] Server to [Server]: [SERVER]: Load hostmission: Battle.mis
[15:19:20] Server to [Server]: [TEST] Номер подмиссии - [0]
[15:19:20] Load landscape...
[15:19:22] Load bridges
[15:19:22] LongBridge: wrong width. (3)
[15:19:24] Load static objects...
[15:19:25] Mission loaded. time = 5,933
[15:19:25] Loading mission ...
[15:19:25] Server to [Server]: [SERVER]: Load submission: destroyAI.mis
[15:19:25] Server to [Server]: [TEST]: ЗАГРУЖЕНА МИССИЯ # [1]
Выходит до загрузки хостмиссии номер подмиссии на единицу меньше определяется?