O Evento Battlefield há para TFS 1.1, 1.2. Portanto, este é o ÚNICO E EXCLUSIVO evento para o TFS 1.0 que a maioria usa.
O Que há nele?
Neste tópico encontraremos os scripts do evento, mapa e arquivo da source.
Há necessidade de alterar o arquivo game.cpp da source e recompilar o TFS para que o evento funcione perfeitamente.
Vamos ao que interessa!
Em data/creaturescripts/scripts crie um arquivo com o nome de BATTLEFIELD_creaturescript.lua com o conteúdo:
dofile('data/lib/BATTLEFIELD_lib.lua') local function getWinnersBattle(storage) for _, online in ipairs(Game.getPlayers()) do if online:isPlayer() then if online:getStorageValue(storage) > 0 then online:teleportTo(online:getTown():getTemplePosition()) online:sendTextMessage(MESSAGE_INFO_DESCR, msg) online:setStorageValue(storage, 0) online:addItem(bf.rewardWin[1], bf.rewardWin[2]) online:unregisterEvent("BattleTeamLife") online:unregisterEvent("BattleTeamMana") online:unregisterEvent("BattleDeath") online:addHealth(online:getMaxHealth()) online:addMana(online:getMaxMana()) online:removeCondition(CONDITION_OUTFIT) if online:isPzLocked() then online:remove() end end end end if storage == bf.teamOne.storage then broadcastMessage("The BattleEvent is finish, team ".. bf.teamOne.name .." win.", MESSAGE_STATUS_WARNING) elseif storage == bf.teamTwo.storage then broadcastMessage("The BattleEvent is finish, team ".. bf.teamTwo.name .." win.", MESSAGE_STATUS_WARNING) end checkGate() print("> BattleField Event was finished.") end function onLogin(cid) local player = Player(cid) if player:getStorageValue(bf.teamOne.storage) > 0 or player:getStorageValue(bf.teamTwo.storage) > 0 then player:setStorageValue(bf.teamOne.storage, 0) player:setStorageValue(bf.teamTwo.storage, 0) player:removeCondition(CONDITION_OUTFIT) player:teleportTo(player:getTown():getTemplePosition()) player:unregisterEvent("BattleTeamLife") player:unregisterEvent("BattleTeamMana") player:unregisterEvent("BattleDeath") end return true end function onLogout(cid) local player = Player(cid) if player:getStorageValue(bf.teamOne.storage) > 0 or player:getStorageValue(bf.teamTwo.storage) > 0 then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can not logout now.") return false end return true end function onChangeHealth(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType) local player = Player(creature) local enemy = Player(attacker) if enemy then if (player:getStorageValue(bf.teamOne.storage) > 0 and enemy:getStorageValue(bf.teamOne.storage) > 0) or (player:getStorageValue(bf.teamTwo.storage) > 0 and enemy:getStorageValue(bf.teamTwo.storage) > 0) or (enemy:isMonster()) and (primaryDamage > 0) then return false end end return primaryDamage, primaryType, secondaryDamage, secondaryType end function onChangeMana(cid, attacker, manaChange) local player = Player(cid) local enemy = Player(attacker) if enemy then player:sendTextMessage(MESSAGE_INFO_DESCR, enemy) if (player:getStorageValue(bf.teamOne.storage) > 0 and enemy:getStorageValue(bf.teamOne.storage) > 0) or (player:getStorageValue(bf.teamTwo.storage) > 0 and enemy:getStorageValue(bf.teamTwo.storage) > 0) or (enemy:isMonster()) then return false end end return manaChange end function onPrepareDeath(cid, killer) local creature = Player(cid) if creature:getStorageValue(bf.teamOne.storage) > 0 then creature:removeCondition(CONDITION_OUTFIT) creature:sendTextMessage(MESSAGE_INFO_DESCR, "You are dead!") creature:teleportTo(creature:getTown():getTemplePosition()) creature:addHealth(creature:getMaxHealth()) creature:addMana(creature:getMaxMana()) creature:unregisterEvent("BattleTeamLife") creature:unregisterEvent("BattleTeamMana") creature:unregisterEvent("BattleDeath") Game.setStorageValue(bf.teamOne.storage, Game.getStorageValue(bf.teamOne.storage) - 1) creature:setStorageValue(bf.teamOne.storage, 0) elseif creature:getStorageValue(bf.teamTwo.storage) > 0 then creature:removeCondition(CONDITION_OUTFIT) creature:sendTextMessage(MESSAGE_INFO_DESCR, "You are dead!") creature:teleportTo(creature:getTown():getTemplePosition()) creature:addHealth(creature:getMaxHealth()) creature:addMana(creature:getMaxMana()) creature:unregisterEvent("BattleTeamLife") creature:unregisterEvent("BattleTeamMana") creature:unregisterEvent("BattleDeath") Game.setStorageValue(bf.teamTwo.storage, Game.getStorageValue(bf.teamTwo.storage) - 1) creature:setStorageValue(bf.teamTwo.storage, 0) end if Game.getStorageValue(bf.teamOne.storage) == 0 then getWinnersBattle(bf.teamTwo.storage) elseif Game.getStorageValue(bf.teamTwo.storage) == 0 then getWinnersBattle(bf.teamOne.storage) end if Game.getStorageValue(bf.teamOne.storage) > 0 and Game.getStorageValue(bf.teamTwo.storage) > 0 then doMsgBattlefield("[BattleField] "..bf.teamOne.name.." "..Game.getStorageValue(bf.teamOne.storage).." VS "..Game.getStorageValue(bf.teamTwo.storage).." " ..bf.teamTwo.name) end if creature:isPzLocked() then creature:remove() end return false end
Em data/creaturescripts/creaturescripts.xml adicione as seguintes linhas:
<event type="login" name="BattleLogin" script="BATTLEFIELD_creaturescript.lua"/> <event type="logout" name="BattleLogout" script="BATTLEFIELD_creaturescript.lua"/> <event type="preparedeath" name="BattleDeath" script="BATTLEFIELD_creaturescript.lua"/> <event type="changehealth" name="BattleTeamLife" script="BATTLEFIELD_creaturescript.lua"/> <event type="changemana" name="BattleTeamMana" script="BATTLEFIELD_creaturescript.lua"/>
Em data/globalevents/script, crie um arquivo com o nome de BATTLEFIELD_globalevents.lua e adicione o conteúdo:
dofile('data/lib/BATTLEFIELD_lib.lua') local function teleportCheck() local tile = Tile(bf.teleportPosition) if tile then local item = tile:getItemById(1387) if item then item:remove() broadcastMessage("The BattleField Event was start in ".. bf.timeOpenGate .." minutes.", MESSAGE_STATUS_WARNING) local team1 = Game.getStorageValue(bf.teamOne.storage) local team2 = Game.getStorageValue(bf.teamTwo.storage) if (team1 + team2) % 2 ~= 0 then local playerLeave = Player(Game.getStorageValue(bf.namePlayer)) playerLeave:teleportTo(playerLeave:getTown():getTemplePosition()) playerLeave:removeCondition(CONDITION_OUTFIT) playerLeave:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You are dead!") playerLeave:addHealth(playerLeave:getMaxHealth()) playerLeave:addMana(playerLeave:getMaxMana()) playerLeave:unregisterEvent("BattleTeamLife") playerLeave:unregisterEvent("BattleTeamMana") playerLeave:unregisterEvent("BattleDeath") Game.setStorageValue(bf.teamTwo.storage, Game.getStorageValue(bf.teamTwo.storage) - 1) playerLeave:setStorageValue(bf.teamTwo.storage, 0) end addEvent(checkGate, bf.timeOpenGate * 60 * 1000) else broadcastMessage("The BattleField Event was opened and will close in ".. bf.timeCloseTeleport .." minutes.", MESSAGE_STATUS_WARNING) Game.setStorageValue(bf.teamOne.storage, 0) Game.setStorageValue(bf.teamTwo.storage, 0) Game.setStorageValue(bf.namePlayer, 0) print("> BattleField Event was opened.") local teleport = Game.createItem(1387, 1, bf.teleportPosition) if teleport then teleport:setActionId(47000) end end end end function onTime(interval) teleportCheck() addEvent(teleportCheck, bf.timeCloseTeleport * 60 * 1000) return true end
Em data/globalevents/globalevents.xml adicione:
<globalevent name="BattleField" time="20:55:00" script="BATTLEFIELD_globalevents.lua" />
Em data/libs crie um arquivo com o nome de BATTLEFIELD_lib com o conteúdo:
-
-[[ LIB BATTLEFIELD TFS 1.0 Arquivos além desta lib: - BATTLEFIELD_globalevents.lua - BATTLEFIELD_movements.lua - BATTLEFIELD_creaturescript.lua - spell invisible.lua -- alterar UTANA VID e STEALTH RING ]]-- bf = { rewardWin = {2160, 10}, teamOne = {name = "Black Assassins", storage = 140120, pos = {x=1006,y=994,z=6}}, teamTwo = {name = "Red Barbarians", storage = 140121, pos = {x=1032,y=994,z=6}}, timeCloseTeleport = 1, timeOpenGate = 1, teleportPosition = {x=1019, y=1016, z=7}, namePlayer = 18400, levelToEvent = 7, itemGate = 3517 } function checkGate() local wall = { {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, {x=1019, y=994, z=6}, } broadcastMessage("The BattleEvent Event will begin now!", MESSAGE_STATUS_WARNING) doMsgBattlefield("[BattleField] "..bf.teamOne.name.." "..Game.getStorageValue(bf.teamOne.storage).." VS "..Game.getStorageValue(bf.teamTwo.storage).." " ..bf.teamTwo.name) print("> BattleField Event will begin now.") for i = 1, #wall do local tile = Tile(wall[i]) if tile then local item = tile:getItemById(bf.itemGate) if item then item:remove() else Game.createItem(bf.itemGate, 1, wall[i]) end end end end function doMsgBattlefield(msg) for _, online in ipairs(Game.getPlayers()) do if online:isPlayer() then if online:getStorageValue(bf.teamOne.storage) > 0 or online:getStorageValue(bf.teamTwo.storage) > 0 then online:sendTextMessage(MESSAGE_INFO_DESCR, msg) end end end end
Em data/movements/scripts crie um arquivo com o nome de BATTLEFIELD_movements com o conteúdo:
dofile('data/lib/BATTLEFIELD_lib.lua') local conditionBlack = Condition(CONDITION_OUTFIT) conditionBlack:setTicks(120 * 60 * 1000) conditionBlack:addOutfit({lookType = 134, lookHead = 114, lookBody = 114, lookLegs = 114, lookFeet = 114}) local conditionRed = Condition(CONDITION_OUTFIT) conditionRed:setTicks(120 * 60 * 1000) conditionRed:addOutfit({lookType = 143, lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94}) function onStepIn(cid, item, position, fromPosition) local player = Player(cid) if player:getLevel() < bf.levelToEvent then player:sendTextMessage(MESSAGE_INFO_DESCR, "You need level " .. bf.levelToEvent .. " to enter in event.") player:teleportTo(fromPosition) return false end if player:getItemCount(2165) >= 1 then player:sendTextMessage(MESSAGE_INFO_DESCR, "You can not enter stealth ring in the event.") player:teleportTo(fromPosition) return false end if Game.getStorageValue(bf.teamOne.storage) < Game.getStorageValue(bf.teamTwo.storage) then Game.setStorageValue(bf.teamOne.storage, Game.getStorageValue(bf.teamOne.storage) + 1) player:addCondition(conditionBlack) player:setStorageValue(bf.teamOne.storage, 1) player:setStorageValue(bf.teamTwo.storage, 0) player:teleportTo(bf.teamOne.pos) player:sendTextMessage(MESSAGE_INFO_DESCR, "You will join the team " .. bf.teamOne.name .. ".") else Game.setStorageValue(bf.teamTwo.storage, Game.getStorageValue(bf.teamTwo.storage) + 1) player:addCondition(conditionRed) player:setStorageValue(bf.teamTwo.storage, 1) player:setStorageValue(bf.teamOne.storage, 0) player:teleportTo(bf.teamTwo.pos) player:sendTextMessage(MESSAGE_INFO_DESCR, "You will join the team " .. bf.teamTwo.name .. ".") Game.setStorageValue(bf.namePlayer, cid) end player:addHealth(player:getMaxHealth()) player:addMana(player:getMaxMana()) player:registerEvent("BattleTeamLife") player:registerEvent("BattleTeamMana") player:registerEvent("BattleDeath") return true end
Em data/movements/movements.xml adicione:
<movevent event="StepIn" actionid="47000" script="BATTLEFIELD_movements.lua"/>
Em data/spells/scripts/support abra o arquivo invisible.lua, apague tudo e coloque:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) dofile('data/lib/BATTLEFIELD_lib.lua') function onCastSpell(cid, var) local player = Player(cid) if player:getStorageValue(bf.teamOne.storage) > 0 or player:getStorageValue(bf.teamTwo.storage) > 0 then return false else return doCombat(cid, combat, var) end end
Conforme avisado, no TFS 1.0 há necessidade de alterar alguns códigos nas fontes, portanto estou disponibilizando o arquivo game.cpp, basta substituir em sua basta e recompila-lo.
Download game.cpp: https://www.sendspace.com/file/vqs5u4
Download Map tradicional: https://www.sendspace.com/file/f5tjhg
Imagem do mapa:
Para configurar, basta ver os arquivos e configurar horário, dias e posições do mapa!
SCRIPT 100% TESTADO, O MESMO É VENDIDO PELO MODERADOR DO OUTRO FÓRUM! PORTANTO SEM ESSA, MODIFICAMOS E, IT'S FREEEEEEEE!
Créditos:
Absolute
Vodkart
Luan Luciano
Markin
Bom Proveito a todos, até o próximo!
FAVOR MOVER O TÓPICO PRA SEÇÃO SCRIPTING > SISTEMAS E MODS, QUE TÁ FOD* CRIAR LÁ....