Results 1 to 5 of 5

Thread: OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

  1. #1
    Ace Cassius's Avatar
    Join Date
    Dec 2011
    Posts
    2,505
    Post Thanks / Like
    Total Downloaded
    307.99 MB

    OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

    Quote Originally Posted by No.401_Wolverine
    Я нашел код, на который ссылался некоторое время назад (пришлось искать его). Это код, прекрасно работающий в однопользовательском режиме и позволяющий сделать одиночные миссии, с некоторыми очень интересными деталями и задачами. Но в мультиплеере этот код не работает должным образом:

    Code:
    public override void OnBuildingKilled(string title, Point3d pos, AiDamageInitiator initiator, int eventArgInt)
        {
            base.OnBuildingKilled(title, pos, initiator, eventArgInt);
    
            string BuildingName = title;
            string BuildingArmy = "";
            string PlayerArmy = "";
            string sectorTitle = "";
            string sectorName = GamePlay.gpSectorName(pos.x, pos.y);
    
            if (GamePlay.gpFrontArmy(pos.x, pos.y) == 1)
            {
                BuildingArmy = "England";
            }
            else if (GamePlay.gpFrontArmy(pos.x, pos.y) == 2)
            {
                BuildingArmy = "France";
            }
            else
            {
                BuildingArmy = "Neutral";
            }
    
            if (initiator.Player.Army() == 1)
            {
                PlayerArmy = "RAF";
            }
            else if (initiator.Player.Army() == 2)
            {
                PlayerArmy = "Luftwaffe";
            }
            else
            {
                PlayerArmy = "Unknown";
            }
    
            GamePlay.gpLogServer(null, "BUILDING:" + BuildingName + " in " + BuildingArmy + " was destroyed in sector " + sectorName + " by " + initiator.Player.Name() + " from the " + PlayerArmy + ".", new object[] { });
        }

    Этот кусок кода, если бы он был исправлен для работы в мультиплеере, смог бы отображать каждое здание (объект) на карте (или объекты, перечисленные как тип - здание, включая даже телефонные будки, часы и т. д.) как цель, которую можно было отслеживать и за которую можно начислять очки, какими бы не были Ваши намерения, без необходимости помещать статические объекты или загружать субмиссии, или что-либо из этого. Промышленным целям не будут нужны триггеры по площади с требованиями к тоннажу или скрытые объекты, которые будут действовать в качестве целей. Аэродромными целями будут просто ангары и башни, которые уже присутствуют (если Вы желаете добавить больше деталей - Вы это можете, если Вам это нужно).
    Вместо того, чтобы провести брифинг, который гласит: «Вам нужно атаковать фабрику в квадрате X, Y и уничтожить этот объект», Вы могли бы просто сказать: «Командующий хочет, чтобы Вы атаковали промышленные объекты». Или: «После атакуйте топливные хранилища, где их сможете найти». Или даже что-то глупое: «Мы должны нарушить банковскую сеть во Франции!»
    (Да, есть здания банков, которые будут идентифицированы этим скриптом). Тогда это ложится на пилотов бомберов, чтобы согласно разведке целей, запланировать миссии и выполнить их.

    И это все, не помещая на карту ни одного объекта.

    Если этот код будет исправлен или изменен для работы в мультиплеере, я бы вернулся к программированию миссий в БоБе в одно мгновение. Черт, если это просто ошибка с моей стороны в кодировании, я вернусь сегодня, если кто-нибудь ее исправит. Никто не исправил вовремя...
    No.401_Wolverine
    Прикольно, создал миссию, включил туда скрипт, попробовал на Штуке...Топливные аэродромные хранилища, четко прописываются...можно что угодно придумать...
    Для творцов Офф-лайн Кампаний, большие возможности.
    OnBuildingKilled.zip
    Штука на Трамкурте...Сервер в окошке прописывает уничтожение здания...ангар, гражданские дома в жилом секторе и т.д. С координатами немного неясно, но разобраться можно...
    Жаль что в мультиплеере пока не работает...

    Xeon X5650 2.67GHz x2 64GB GTX 680 4Gb Acer GN246HL 1920x1080 Win 7 64 / Win 10

  2. Likes Sandy1942, Rostic, Zerg_rcm, Piper-Kiev liked this post
  3. #2
    Combat pilot Piper-Kiev's Avatar
    Join Date
    Jan 2013
    Location
    Kiev
    Posts
    161
    Post Thanks / Like
    Total Downloaded
    60.10 MB

    Arrow Re: OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

    Всем привет!
    А поподробней можно куда этот скрипт положить и где в полном редакторе его прописать?

  4. #3
    Ace Cassius's Avatar
    Join Date
    Dec 2011
    Posts
    2,505
    Post Thanks / Like
    Total Downloaded
    307.99 MB

    Re: OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

    Привет Сереж!
    Мне нужно немного времени, что бы еще чекнуть работу скрипта, там с координатами, с выводом, что то не так... и оформить. Но для одиночной Кампании, это будет работать 100%.
    Этот скрипт работает и через внутри БоБовский сервер, но только, для запустившего его и соответственно миссию.
    Хоть выполнение задания, по уничтожению конкретного одиночного ( или нескольких ) объекта (объектов) - здание, ангар, топливохранилище, вышка...да что угодно...
    Не нужно устанавливать скрытые статики, для обработки уничтожения объекта...только как соответствующий антураж, присутствия...ну еще я "закапывал" аэродромные топливные цистерны (Z-offset), под статики, что бы было подобие голливудщины ...взрывается красиво...
    И никаких тригерров...
    Last edited by Cassius; Mar-25-2017 at 15:45.

    Xeon X5650 2.67GHz x2 64GB GTX 680 4Gb Acer GN246HL 1920x1080 Win 7 64 / Win 10

  5. Likes Sandy1942, Piper-Kiev, Zerg_rcm liked this post
  6. #4
    Ace Cassius's Avatar
    Join Date
    Dec 2011
    Posts
    2,505
    Post Thanks / Like
    Total Downloaded
    307.99 MB

    Re: OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

    Все разобрался...тупанул конкретно...он мне в расположении уничтоженного объекта, какую то хрень выводил...типа <,21...<,>...а в Хокинже DI,130 ну это уже на что то похоже, но все равно хрень...
    Короче, все оказалось, как обычно...невнимательность... в полном редакторе, район боевых действий, не был правильно настроен. Все работает. Выглядит так.

    Я чуть исправил, что бы на русском выводил. Если выводить на центр экрана используя GamePlay.gpHUDLogCenter(), (как на ATAG сообщения о уничтожении, конце миссии и т.п.) то не о всех целях будет вывод. Поэтому лучше через сообщение сервера GamePlay.gpLogServer().
    Теперь формат строки вывода...его можно тоже править, оставив только то, что нужно.
    Что бы это применить в миссии, нужно создавать файл скрипта, с таким же именем, как и файл миссии. Если файл миссии battle.mis, то файл скрипта battle.cs
    Вот пример этого файла. Но это все типа демонстрация, как этот метод работает.
    Code:
    using System;
    using System.IO;
    using maddox.game;
    using maddox.game.world;
    using System.Collections.Generic;
    using maddox.GP;
    
    public class Mission : AMission
    {
    
    public override void OnBuildingKilled(string title, Point3d pos, AiDamageInitiator initiator, int eventArgInt)
        {
            base.OnBuildingKilled(title, pos, initiator, eventArgInt);
    
            string BuildingName = title;
            string BuildingArmy = "";
            string PlayerArmy = "";
            //string sectorTitle = "";
            string sectorName = GamePlay.gpSectorName(pos.x, pos.y);
            
    		
            if (GamePlay.gpFrontArmy(pos.x, pos.y) == 1)
            {
                BuildingArmy = " в Англии";
            }
            else if (GamePlay.gpFrontArmy(pos.x, pos.y) == 2)
            {
                BuildingArmy = "во Франции";
            }
            else
            {
                BuildingArmy = "Neutral";
            }
    
            if (initiator.Player.Army() == 1)
            {
                PlayerArmy = "RAF";
            }
            else if (initiator.Player.Army() == 2)
            {
                PlayerArmy = "Luftwaffe";
            }
            else
            {
                PlayerArmy = "Unknown";
            }
    
            //GamePlay.gpLogServer(null, "BUILDING:" + BuildingName + " in " + BuildingArmy + " was destroyed in sector " + sectorName + " by " + initiator.Player.Name() + " from the " + PlayerArmy + ".", new object[] { });
           //GamePlay.gpHUDLogCenter(null, "Объект" + BuildingName + "  " + BuildingArmy + " уничтожен в секторе " + sectorName + "  " + initiator.Player.Name() + "  " + PlayerArmy + ".", new object[] { });
    	 GamePlay.gpLogServer(null, "Объект " + BuildingName + " " + BuildingArmy + " уничтожен в секторе " + sectorName + "  " + initiator.Player.Name() + "  " + PlayerArmy + ".", new object[] { });
    	}
    	
    }
    Если же нам нужен файл скрипта для миссии, где в брифинге дается задание, например уничтожить Топливные Хранилища в Солсбери или еще что то где то...то этот скрипт, нужно править...прописывать туда условие уничтожения объектов Топливного Хранилища именно в Солсбери, с координатами такими то. И при их уничтожении, код (как он прописан в скрипте) все это, либо посчитает и выведет на экран, либо просто посчитает и будет ждать следующей команды...уничтожения других объектов, а потом сообщение о успешном выполнении задания...

    Я в этих делах...дилетант...пользуюсь уже готовым, или так поверхностно можно что то исправить, переделать под себя. Потом есть у кого можно спросить, жалко конечно, что не из нашего коммюнити...но все же...Поэтому нужно знать задачу.
    И конечно спасибо No.401_Wolverine

    P.S.
    Только что проверил, что этот код работает и для поставленных вручную в полном редакторе объектов...Ставил на филд жилые дома и большие топливные хранилища...Все корректно. Но с ними нужно все же проверять, Reddog говорил, что у них не работал со объектами поставленными в полном редакторе...
    Может быть он имел ввиду он-лайн мультиплеер...
    И да, для мостов эта фича не работает...проверял...а мосты - это очень хорошая цель для любой миссии.
    Last edited by Cassius; Mar-27-2017 at 12:17.

    Xeon X5650 2.67GHz x2 64GB GTX 680 4Gb Acer GN246HL 1920x1080 Win 7 64 / Win 10

  7. Likes Starik, Zerg_rcm, Sandy1942, Piper-Kiev liked this post
  8. #5
    Ace Cassius's Avatar
    Join Date
    Dec 2011
    Posts
    2,505
    Post Thanks / Like
    Total Downloaded
    307.99 MB

    Re: OnBuildingKilled скрипт, некоторые новые возможности для авторов Миссий.

    Собственно, вот пример, как эту возможность использовать...

    Брифинг.
    Разведкой выявлено наличие в городе Ситтингбурн квадрат AT25, стратегического производства. Оно сосредоточено в двух промышленных зданиях.
    Местоположение объектов указано на снимке.
    Brief_1.jpg
    Задача. Уничтожить два этих объекта.

    Код скрипта с комментариями
    Code:
    using System;
    using System.IO;
    using maddox.game;
    using maddox.game.world;
    using System.Collections.Generic;
    using maddox.GP;
    
    public class Mission : AMission
    {
           int a = 0; // переменная счетчика уничтоженных зданий
    
    	   public override void OnBuildingKilled(string title, Point3d pos, AiDamageInitiator initiator, int eventArgInt)
        {
            base.OnBuildingKilled(title, pos, initiator, eventArgInt);
    
            string BuildingName = title; // переменная, содержащая имя уничтоженного объекта
            string BuildingName_target = "Germany Industrial Huge Factory"; // переменная, содержащая имя объекта, который необходимо уничтожить (цель)
    		
    		string BuildingArmy = "";
            string PlayerArmy = "";
            //string sectorTitle = "";
            string sectorName = GamePlay.gpSectorName(pos.x, pos.y); // переменная, содержащая сектор уничтоженного объекта 
            string sectorName_target = "AT,25"; // переменная, содержащая сектор объекта, который необходимо уничтожить (цель)
    		
    		
            if (GamePlay.gpFrontArmy(pos.x, pos.y) == 1)             // проверка условия местоположения уничтоженного объекта, если 1, то Англия, если 2, то Франция
            {                                                        // переменная BuildingArmy будет содержать - Англия либо Франция, или Нетраль
                BuildingArmy = " в Англии";                          
            }
            else if (GamePlay.gpFrontArmy(pos.x, pos.y) == 2)
            {
                BuildingArmy = "во Франции";
            }
            else
            {
                BuildingArmy = "Neutral";
            }
    
            if (initiator.Player.Army() == 1)                       // проверка условия принадлежности стороны уничтожившего цель
            {
                PlayerArmy = "RAF";
            }
            else if (initiator.Player.Army() == 2)
            {
                PlayerArmy = "Luftwaffe";
            }
            else
            {
                PlayerArmy = "Unknown";
            }
    
            
    		if (sectorName == sectorName_target) // проверка условия, что сектор уничтоженного объекта совпадает с сектором цели
    		{
    	        if (BuildingName == BuildingName_target) // проверка условия, что имя уничтоженного объекта совпадает с именем цели
    		
    		    
    			a++;                                    // счетчик уничтоженных объектов
    		
    		
    		
    		if (a == 2)                                // проверка условия, количества уничтоженных объектов
    		{
    			GamePlay.gpHUDLogCenter(null, " ЗАДАЧА ВЫПОЛНЕНА! ", new object[] { });  // сообщение на экран
    		}	
    		
    		}                            
    		
    		// вывод сообщения Сервера о объекте, его принадлежности, секторе местоположения, и о пилоте
    		
    		//GamePlay.gpLogServer(null, "BUILDING:" + BuildingName + " in " + BuildingArmy + " was destroyed in sector " + sectorName + " by " + initiator.Player.Name() + " from the " + PlayerArmy + ".", new object[] { });
      	    //GamePlay.gpHUDLogCenter(null, "Объект" + BuildingName + "  " + BuildingArmy + " уничтожен в секторе " + sectorName + "  " + initiator.Player.Name() + "  " + PlayerArmy + ".", new object[] { });
    	    GamePlay.gpLogServer(null, "Объект " + BuildingName + " " + BuildingArmy + " уничтожен в секторе " + sectorName + "  " + initiator.Player.Name() + "  " + PlayerArmy + ".", new object[] { });
    	}
    	
    }
    Выглядит это так


    Понятно, что бы на нулях так не хулиганили, нужны зены...Это только демо...И да сам объект состоит из трех частей A, B и C. Но считается только когда полностью уничтожен.

    Заранее прошу извинить, если у пользователя со скилом программиста, эти строчки кода вызывают боль

    Файл скрипта
    Sittingbourne.zip
    Файл миссии любой, в ангарах нет техники, ее можно просто поставить для присутствия.
    Last edited by Cassius; Mar-30-2017 at 01:27.

    Xeon X5650 2.67GHz x2 64GB GTX 680 4Gb Acer GN246HL 1920x1080 Win 7 64 / Win 10

  9. Likes Sandy1942, Piper-Kiev liked this post

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •