[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Подключение скриптов через Scripts.xml
firsacho
Админы
Сообщений: 3813
Реп: 84 / Инв: 15
Вот такая проблема, которая вводит меня в недоумение - Уже давно замечено, что при отключении скрипта stdvs у мультиплеерных картах следует вылет, даже если его скопировать и переименовать а затем подключить под новым именем - опять же следует вылет, то есть где то стоит проверка на присутствии этого скрипта в мультиплеерных картах. То же самое заметил и в скриптах миссий. Здесь все намного хуже: например у ChallengeCrate должен обязательно стоять скрипт ChallengeCrate, даже если вместо него вставить такой же с другим названием- вылет. При создании своей миссии также вылет. То есть прийдется изменять готовые скрипты миссий. Также не знаю обязательно ли скрипт с миссией должен соответствовать ID миссии.

Есть такая идея решения этой проблемы. Допустим взять stdvs, скопировать, удалить из него все что является скриптом кроме структуры файла, чтоб ошибки не возникало, и подключить копию stdvs вторым скриптом.
Но, вопрос к герычу - я не знаю какая структура должна быть у файла скрипта минимально, чтобы он не нес никаких функций, и в то же время не вызывал ошибки? Просто скрипт-пустышка (blank), который можно уже дописывать, чтоб писать свой скрипт.




Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

mod.worms.pro - мод Worms Renewation для Worms4
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
смотри как это можно решить. Вообще, как работает lua. Он загружает все скрипты в один текст, то есть к примеру идёт так:

текст из stdlib.lua
текст из stdvs.lua
текст из других файлов

потом полученный текст выполняется последовательно.
В lua код не обязательно находится в теле функции, к примеру(это псевдокод, подразумевается, что DisplayComment выводит на экран текст):

Code

DisplayComment("Вне функции")

function a()
   DisplayComment("В функции")
end

a()
DisplayComment("Ещё раз вне функции")

Этот код выведет:

Code
Вне функции
В функции
Ещё раз вне функции

В lua можно переопределять функции:

Code

function a()
   DisplayComment("1")
end

function a()
   DisplayComment("2")
end

a()

тут вызовется не первая, а вторая функция(на экран выведется 2).

В lua есть несколько типов данных: строки(текст), числа, таблицы, функции. То есть мы можем хранить ссылку на функцию в переменной, поэтому можно написать такой код:

Code

function a()
   DisplayComment("1")
end

OldAFunction=a

function a()
   DisplayComment("2")
end

a()
OldAFunction()

тут на экран выведется 2 1. При этом строку:

Code
OldAFunction=a

надо писать до переопределения функции.

Теперь ближе к червям. В stdvs к примеру есть функция

Code
function Initialise()
    StartedSuddenDeath = false
     
    SetupScheme()

    lib_SetupMultiplayerWormsAndTeams()
    SendMessage("WormManager.Reinitialise")

    lib_SetupMinesAndOildrums() -- do this after worms are set up to get correct worm collision

    local scheme = QueryContainer("GM.SchemeData")
    if scheme.RoundTime == 0 then
       StartSuddenDeath() -- do this after worms are set up to readjust health
       local GameOver = GetData("FCS.GameOver")
       -- do no further processing if sudden death drew the game
       if GameOver ~= 0 then
          return  
       end
    end
     
    if scheme.MineFactoryOn == true then
       SendMessage("GameLogic.CreateRandMineFactory")
    end
     
    if scheme.TelepadsOn == true then
        SendMessage("GameLogic.PlaceTelepads")        
    end
     
    SetData("Camera.StartOfTurnCamera","Default")
     
    SetWormpotModes()
     

    WaitingForStartFirstTurn = false
    StartFirstTurn()
end

В своём скрипте фактически можно написать так:

Code

OldInitialize=Initialize
function Initialise()
    -- тут проводим свою инициализацию
   OldInitialize()  --когда необходимо вызываем старый обработчик
    -- продолжаем свою инициализацию
end

Про подключение сриптов я тоже не супер разобрался...


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
а, на вопрос то толком не ответил) короче можешь написать MyScript.lua, в котором будет такой текст:

Code
OldInitialise=Initialise
function Initialise()
    OldInitialise()
end

OldSetSpecialWeapon=SetSpecialWeapon
function SetSpecialWeapon(TeamIndex, WeaponName)
    OldSetSpecialWeapon(TeamIndex, WeaponName)
end

OldDoOncePerTurnFunctions=DoOncePerTurnFunctions
function DoOncePerTurnFunctions()
    OldDoOncePerTurnFunctions()
end

OldSetupScheme=SetupScheme
function SetupScheme()
    OldSetupScheme()
end

OldSetupInventoriesAndDelays=SetupInventoriesAndDelays
function SetupInventoriesAndDelays()
    OldSetupInventoriesAndDelays()
end

OldIncrementAlliedInventory=IncrementAlliedInventory
function IncrementAlliedInventory(AlliedGroup, Weapon)
    OldIncrementAlliedInventory(AlliedGroup, Weapon)
end

OldStockpile=Stockpile
function Stockpile()
    OldStockpile()
end

OldRoundOver=RoundOver
function RoundOver()
    OldRoundOver()
end

OldTurnStarted=TurnStarted
function TurnStarted()
    OldTurnStarted()
end

OldSetupTeleportIn=SetupTeleportIn
function SetupTeleportIn()
    OldSetupTeleportIn()
end

OldTeleportIn=TeleportIn
function TeleportIn()
    OldTeleportIn()
end

OldTimer_GameTimedOut=Timer_GameTimedOut
function Timer_GameTimedOut()
    OldTimer_GameTimedOut()
end

OldCheckSuddenDeath=CheckSuddenDeath
function CheckSuddenDeath()
    OldCheckSuddenDeath()
end

OldStartSuddenDeath=StartSuddenDeath
function StartSuddenDeath()
    OldStartSuddenDeath()
end

OldGameLogic_NoActivity=GameLogic_NoActivity
function GameLogic_NoActivity()
    OldGameLogic_NoActivity()
end

OldWorm_Died=Worm_Died
function Worm_Died()
    OldWorm_Died()
end

----

OldStartFirstTurn=StartFirstTurn
function StartFirstTurn()
    OldStartFirstTurn()
end

OldStartTurn=StartTurn
function StartTurn()
    OldStartTurn()
end

OldRunAILogic=RunAILogic
function RunAILogic()
    OldRunAILogic()
end

OldTimer_HotSeatTimedOut=Timer_HotSeatTimedOut
function Timer_HotSeatTimedOut()
    OldTimer_HotSeatTimedOut()
end

OldGameLogic_EndTurn_Immediate=GameLogic_EndTurn_Immediate
function GameLogic_EndTurn_Immediate()
    OldGameLogic_EndTurn_Immediate()
end

OldTimer_RetreatTimedOut=Timer_RetreatTimedOut
function Timer_RetreatTimedOut()
    OldTimer_RetreatTimedOut()
end

OldWorm_Damaged_Current=Worm_Damaged_Current
function Worm_Damaged_Current()
    OldWorm_Damaged_Current()
end

OldTimer_TurnTimedOut=Timer_TurnTimedOut
function Timer_TurnTimedOut()
    OldTimer_TurnTimedOut()
end

OldTimer_PostActivityTimedOut=Timer_PostActivityTimedOut
function Timer_PostActivityTimedOut()
    OldTimer_PostActivityTimedOut()
end
     
OldCheckActivity=CheckActivity
function CheckActivity()
    OldCheckActivity()
end

OldDoPostActivity=DoPostActivity
function DoPostActivity()
    OldDoPostActivity()
end

OldTurnEnded=TurnEnded
function TurnEnded()
    OldTurnEnded()
end

OldCheckOneTeamVictory=CheckOneTeamVictory
function CheckOneTeamVictory()
    OldCheckOneTeamVictory()
end

OldEndTurn=EndTurn
function EndTurn()
    OldEndTurn()
end

OldSetWind=SetWind
function SetWind()
    OldSetWind()
end

OldSelectRandomWind=SelectRandomWind
function SelectRandomWind()
    OldSelectRandomWind()
end

OldSetWormpotModes=SetWormpotModes
function SetWormpotModes()
    OldSetWormpotModes()
end

и если нужно в нужной функции меняй тело


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
  • Страница 1 из 1
  • 1
Поиск: