???
Математика на уровне МГУ

Показано с 1 по 25 из 168

Тема: Полный редактор и скрипты.

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Полный редактор и скрипты.

    Думаю такая тема назрела. Покопал немножко скрипты, основываясь на существующих кампаниях, плюс прошелся студией по некоторым сборкам.

    Что мы имеем на этот момент.

    Скрипт представляет собой обычный (ну или почти) cs файл со всеми полагающимися атрибутами. Скажем скрипт от одной из миссий, исключая реализацию выглядел так:
    Код:
    //$reference Campaign.dll
    //-$debug
    using System;
    using maddox.game;
    using maddox.game.world;
    
    public class Mission : maddox.game.campaign.Mission {
    
    	// здесь реализация....
     
    }
    Т.е., нам надо создать новый класс (Mission), наследуемый от класса maddox.game.campaign.Mission.

    Далее, методом переопределения существующих виртуальных методов класса-предка, собственно и пишем всю подноготную для миссии.

    Собственно класс maddox.game.campaign.Mission я как то не нашел (уже нашел), но зато обнаружил абстрактный класс AMission (maddox.game.campaign.Mission наследуется от него прямо). Далее выкладываю список всех виртуальных методов этого класса (первая строчка - защищенный конструктор, его ИМХО трогать пока не надо.), а также публичные поля класса. С которыми разобрался, напишу дополнительно, ну и постараюсь походу информацию дополнять, включая информацию по используемым классам (таких как AiActor к примеру и т.д.).
    Код:
    protected AMission()
    public virtual void Init(maddox.game.ABattle battle, int missionNumber)
    public virtual void Inited()
    public virtual bool IsMissionListener(int missionNumber)
    public virtual void OnActorCreated(int missionNumber, string shortName, maddox.game.world.AiActor actor)
    public virtual void OnActorDamaged(int missionNumber, string shortName, maddox.game.world.AiActor actor, maddox.game.world.AiDamageInitiator initiator, part.NamedDamageTypes damageType)
    public virtual void OnActorDead(int missionNumber, string shortName, maddox.game.world.AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
    public virtual void OnActorDestroyed(int missionNumber, string shortName, maddox.game.world.AiActor actor)
    public virtual void OnActorTaskCompleted(int missionNumber, string shortName, maddox.game.world.AiActor actor)
    public virtual void OnAiAirNewEnemy(maddox.game.world.AiAirEnemyElement element, int army)
    public virtual void OnAircraftCrashLanded(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
    public virtual void OnAircraftCutLimb(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiDamageInitiator initiator, part.LimbNames limbName)
    public virtual void OnAircraftDamaged(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiDamageInitiator initiator, part.NamedDamageTypes damageType)
    public virtual void OnAircraftKilled(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
    public virtual void OnAircraftLanded(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
    public virtual void OnAircraftLimbDamaged(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft, maddox.game.world.AiLimbDamage limbDamage)
    public virtual void OnAircraftTookOff(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
    public virtual void OnAutopilotOff(maddox.game.world.AiActor actor, int placeIndex)
    public virtual void OnAutopilotOn(maddox.game.world.AiActor actor, int placeIndex)
    public virtual void OnBattleInit()
    public virtual void OnBattleStarted()
    public virtual void OnBattleStoped()
    public virtual void OnCarter(maddox.game.world.AiActor actor, int placeIndex)
    public virtual void OnMissionLoaded(int missionNumber)
    public virtual void OnPersonHealth(maddox.game.world.AiPerson person, maddox.game.world.AiDamageInitiator initiator, float deltaHealth)
    public virtual void OnPersonMoved(maddox.game.world.AiPerson person, maddox.game.world.AiActor fromCart, int fromPlaceIndex)
    public virtual void OnPersonParachuteFailed(maddox.game.world.AiPerson person)
    public virtual void OnPersonParachuteLanded(maddox.game.world.AiPerson person)
    public virtual void OnPlaceEnter(maddox.game.Player player, maddox.game.world.AiActor actor, int placeIndex)
    public virtual void OnPlaceLeave(maddox.game.Player player, maddox.game.world.AiActor actor, int placeIndex)
    public virtual void OnPlayerArmy(maddox.game.Player player, int army)
    public virtual void OnPlayerConnected(maddox.game.Player player)
    public virtual void OnPlayerDisconnected(maddox.game.Player player, string diagnostic)
    public virtual void OnSingleBattleSuccess(bool success)
    public virtual void OnTickGame()
    public virtual void OnTickReal()
    public virtual void OnTrigger(int missionNumber, string shortName, bool active)
    public virtual void Timeout(double sec, maddox.game.DoTimeout doTimeout)
    
    public maddox.game.ABattle Battle { get; }
    public maddox.game.IGamePlay GamePlay { get; }
    public int MissionNumber { get; }
    public int MissionNumberListener { set; get; }
    public maddox.game.world.ITime Time { get; }
    Как видно, названия многих методов говорят сами за себя.
    Далее маленький пример. Скажем реакция на триггер:

    Переопределяем метод OnTrigger

    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
    // здесь реализация...
    }


    Собственно реализация..

    if ("trigger".Equals(shortName) && active)
    {
    GamePlay.gpHUDLogCenter("Сработал триггер trigger");
    }


    Человеческий перевод. Если имя триггера равно trigger и он активен (т.е. условия триггера выполнены) пишем надпись по центру экрана "Сработал триггер trigger".

    В итоге у нас получится что-то вроде этого:

    Код:
    //$reference Campaign.dll
    //-$debug
    using System;
    using maddox.game;
    using maddox.game.world;
    
    public class Mission : maddox.game.campaign.Mission {
    
    	public override void OnTrigger(int missionNumber, string shortName, bool active)
            {
                if ("trigger".Equals(shortName) && active)
               {
                    GamePlay.gpHUDLogCenter("Сработал триггер trigger");
                }   
            }
     
    }
    Конечно, для того что бы что-то писать, надо хотя бы немного знать C#. В целом это весьма несложно. Также информацию можно почерпнуть, просмотрев скрипты к миссиям кампаний (....Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\mission\campaign)

    Кстати GamePlay.gpHUDLogCenter() не будет работать, если в миссии нет игроков-людей... Брехня, таки работает.

    Примеры скриптов.
    Ниже буду размещать примеры скриптов. Может кто-то еще чего подскажет.

    ________________________

    Запуск действия
    (Сейчас с игре похоже присутствует только один тип действия - рождение группы).

    1. Подготовка.
    Создаем группу самолетов как обычно, но в свойствах группы ставим флажок "Старт скриптом". Группа не появится до тех пор, пока мы ее сами не запустим.
    2. Идем в "Скрипты" на вкладку "Действия". Создаем новое действие, называем его, например "TestAction" (без кавычек), жмакаем "Выбрать группу" и указываем созданную нами в первом шаге группу.

    3. Допустим, мы хотим, что-бы группа родилась, когда кого то отправят к праотцам. Это может быть что угодно, как самолет так и прочее... Переходим на вкладку скрипты и пишем следующее:

    Код:
    using System;
    using maddox.game;
    using maddox.game.world;
    
    
    class Mission : maddox.game.AMission
    {
    	public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
    	{
    		base.OnActorDead(missionNumber, shortName, actor, damages);
    		AiAction action = GamePlay.gpGetAction("TestAction");
    		if (action != null)
    		{
    			action.Do();
    		}
    	}
    }
    Обратите внимание. Наследоваться надо не от maddox.game.campaign.Mission, а от maddox.game.AMission. Это актуально для сингловых миссий и (возможно) мультиплеерных. Для миссий в кампании надо наследоваться от maddox.game.campaign.Mission. Этот класс предоставляет еще одно свойство Campaign, который позволяет управлять кампанией.

    Человеческим языком:

    public override void OnActorDead(...)
    Переопределили метод, который вызывается при чьей либо смерти.

    base.OnActorDead(missionNumber, shortName, actor, damages);
    В принципе можно не вызывать, но для порядка пусть будет.

    AiAction action = GamePlay.gpGetAction("TestAction");
    if (action != null)
    {
    action.Do();
    }

    В первой строчке получили объект действия по его имени. Как мы помним, это было "TestAction"
    Вторая строчка - проверяем, действительно ли ц нас есть такое действие (от опечаток никто не застрахован), и, если оно есть (т.е. не равно null), вызываем метод действия Do(). Что значит "Сделать". Вуаля. Наша группа появляется и топает по маршруту.
    Крайний раз редактировалось Small_Bee; 10.04.2011 в 00:01.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •