Postado Dezembro 30, 2015 9 anos Nome: Zombie Event Versão TFS: 1.x Créditos: Printer Preview http://2.1m.yt/xHhGcL9.png Características Quantidade minima e máxima de players e zombies. Começar automaticamente através do Globalevent ou por comando. Se juntar ao evento através do teleport ou do comando. Contagem de zumbis e de mortes. Três troféus com descrição e data. BUGS CORRIGIDOS! Atenção Adicione no-logout tool do RME na sala de espera e também na área do evento. Tutorial data/creaturescripts/creaturescripts.xml <!-- Zombie Event --> <event type="preparedeath" name="ZombiePlayerDeath" script="player/zombieEventDeath.lua" /> <event type="death" name="ZombieOnDeath" script="player/zombieEventDeath.lua" /> data/creaturescripts/scripts/zombieEventDeath.lua function onDeath(monster, corpse, killer, mostDamage, unjustified, mostDamage_unjustified) -- Send text and effect monster:say("I WILL BE BACK!", TALKTYPE_MONSTER_YELL) monster:getPosition():sendMagicEffect(CONST_ME_MORTAREA) -- Remove zombie count, when it dies Game.setStorageValue(ze_zombieCountGlobalStorage, getZombieEventZombieCount() - 1) -- Store player kills local killerId = killer:getId() if zombieKillCount[killerId] ~= nil then zombieKillCount[killerId] = zombieKillCount[killerId] + 1 else zombieKillCount[killerId] = 1 end return true end function onPrepareDeath(player, killer) -- Remove player from count local count = getZombieEventJoinedCount() Game.setStorageValue(ze_joinCountGlobalStorage, count - 1) -- Reset player after death player:teleportTo(player:getTown():getTemplePosition()) player:setStorageValue(ze_joinStorage, 0) player:addHealth(player:getMaxHealth()) player:addMana(player:getMaxMana()) -- Let's reward the 3 last players if count <= 3 then local playerName = player:getName() local trophy = ze_trophiesTable[count] local item = player:addItem(trophy.itemid, 1) if item then item:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, string.format("%s %s\n%s.", playerName, trophy.description, os.date("%x"))) end -- Store kill count and remove from table to avoid memory leak local playerId, killCount = player:getId(), 0 if zombieKillCount[playerId] ~= nil then killCount = zombieKillCount[playerId] zombieKillCount[playerId] = nil end -- Broadcast Game.broadcastMessage(string.format("%d place goes to %s of Zombie Event versus %d Zombies and slained %d Zombies.", count, playerName, getZombieEventZombieCount(), killCount)) -- The last player died, let's reset the event if count <= 1 then resetZombieEvent() end end return false end data/movements/movements.xml <!-- Zombie Event --> <movevent event="StepIn" actionid="7000" script="zombieEventTeleport.lua" /> data/movements/scripts/zombieEventTeleport.lua Spoiler function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if not player == nil then return true end -- If it's a staff memeber, just teleport inside and do not count as participant if player:getGroup():getAccess() then player:teleportTo(ze_WaitingRoomStartPosition) return true end -- If the event state is closed or started, then stop players from enter if isInArray({ze_EVENT_CLOSED, ze_EVENT_STARTED}, getZombieEventState()) then player:teleportTo(fromPosition, true) fromPosition:sendMagicEffect(CONST_ME_TELEPORT) return true end -- Check if the event has already max players if getZombieEventJoinedCount() >= ze_maxPlayers then player:sendTextMessage(MESSAGE_INFO_DESCR, "The Zombie Event is already full.") player:teleportTo(fromPosition, true) fromPosition:sendMagicEffect(CONST_ME_TELEPORT) return true end -- Execute join event player:joinZombieEvent() return true end data/talkactions/talkactions.xml <talkaction words="!zombie" separator=" " script="zombieEventCommands.lua" /> data/talkactions/scripts/zombieEventCommands.lua Spoiler function onSay(player, words, param) local split = param:split(",") if split[1] == "join" then -- If it's a staff member, just teleport inside and do not count as a participant if player:getGroup():getAccess() then player:teleportTo(ze_WaitingRoomStartPosition) return false end -- If the state of the event is closed or started, stop them from join if isInArray({ze_EVENT_CLOSED, ze_EVENT_STARTED}, getZombieEventState()) then return false end -- If player got pz, forbid them to join if player:isPzLocked() then player:sendCancelMessage("You cannot join while your in a fight.") return false end -- If there is max players joined, stop them from join if getZombieEventJoinedCount() >= ze_maxPlayers then player:sendCancelMessage("The event is already full.") return false end -- Execute join event player:joinZombieEvent() elseif split[1] == "start" then -- If not staff member, they stop them from setup a event if not player:getGroup():getAccess() then return false end local minPlayers = tonumber(split[2]) local maxPlayers = tonumber(split[3]) local waitTime = tonumber(split[4]) local failStart = false if minPlayers == nil or minPlayers < 1 then failStart = true elseif maxPlayers == nil or maxPlayers > Game.getPlayerCount() then failStart = true elseif waitTime == nil or waitTime < 1 then failStart = true end if failStart then player:sendCancelMessage("!zombie start, [minPlayers, maxPlayers, waitTime].") return false end -- Set the new variables and setup the event setupZombieEvent(minPlayers, maxPlayers, waitTime) end return false end data/global.lua dofile('data/zombieEvent.lua') data/zombieEvent.lua Spoiler -- Store player kills if zombieKillCount == nil then zombieKillCount = {} end -- Zombie Variables ze_zombieName = "Zombie Event" -- Zombie name ze_timeToStartInvasion = 30 -- When should the first zombie be summoned [seconds] ze_zombieSpawnInerval = 5 -- The interval of each zombie that will get summoned ze_zombieMaxSpawn = 20 -- Max zombies in the arena ze_zombieCountGlobalStorage = 100 -- Use empty global storage -- Player Variables ze_joinStorage = 1000 -- Storage that will be added, when player join ze_minPlayers = 1 -- Minimum players that have to join ze_maxPlayers = 10 -- Maxnimum players that can join ze_joinCountGlobalStorage = 101 -- Use empty global storage -- States ze_stateGlobalStorage = 102 -- Use empty global storage ze_EVENT_CLOSED = 0 ze_EVENT_STATE_STARTUP = 1 ze_EVENT_STARTED = 2 -- Waiting room ze_WaitingRoomStartPosition = Position(138, 373, 6) -- Where should player be teleport in waiting room ze_waitingRoomCenterPosition = Position(138, 373, 6) -- Center of the waiting room ze_waitingRoomRadiusX = 25 -- Depends how big the arena room is 25sqm to x ze_waitingRoomRadiusY = 25 -- Depends how big the arena room is 25sqm to y -- Zombie arena ze_zombieArenaStartPosition = Position(162, 374, 5) -- When even start where should player be teleported in the zombie arena? ze_arenaCenterPosition = Position(162, 374, 5) -- Center position of the arena ze_arenaFromPosition = Position(154, 368, 5) -- Pos of top left corner ze_arenaToPosition = Position(168, 379, 5) -- Pos of bottom right corner ze_arenaRoomRadiusX = 50 -- Depends how big the arena room is 50sqm to x ze_arenaRoomRadiusY = 50 -- Depends how big the arena room is 50sqm to y ze_arenaRoomMultifloor = false -- Does the arena have more floors than one? -- Other variables ze_waitTime = 10 -- How long until the event begin? ze_createTeleportPosition = Position(158, 387, 6) -- Where should the teleport be created? ze_teleportActionId = 7000 -- Actionid of the teleport ze_trophiesTable = { [1] = {itemid = 7369, description = "won first place on Zombie Event."}, [2] = {itemid = 7370, description = "won second place on Zombie Event."}, [3] = {itemid = 7371, description = "won third place on Zombie Event."} } -- Get methods function getZombieEventZombieCount() return Game.getStorageValue(ze_zombieCountGlobalStorage) end function getZombieEventJoinedCount() return Game.getStorageValue(ze_joinCountGlobalStorage) end function setZombieEventState(value) Game.setStorageValue(ze_stateGlobalStorage, value) end function getZombieEventState() return Game.getStorageValue(ze_stateGlobalStorage) or ze_EVENT_CLOSED end function resetZombieEvent() -- Reset variables Game.setStorageValue(ze_zombieCountGlobalStorage, 0) Game.setStorageValue(ze_joinCountGlobalStorage, 0) setZombieEventState(ze_EVENT_CLOSED) -- Clear the arena from zombies local spectator = Game.getSpectators(ze_arenaCenterPosition, ze_arenaRoomMultifloor, false, 0, ze_arenaRoomRadiusX, 0, ze_arenaRoomRadiusY) for i = 1, #spectator do if spectator[i]:isMonster() then spectator[i]:remove() end end end function startZombieEvent() local spectator = Game.getSpectators(ze_waitingRoomCenterPosition, ze_arenaRoomMultifloor, false, 0, ze_waitingRoomRadiusX, 0, ze_waitingRoomRadiusY) if getZombieEventJoinedCount() < ze_minPlayers then for i = 1, #spectator do spectator[i]:teleportTo(spectator[i]:getTown():getTemplePosition()) spectator[i]:setStorageValue(ze_joinStorage, 0) end resetZombieEvent() Game.broadcastMessage("Zombie event failed to start, due to not enough of participants.") else for i = 1, #spectator do spectator[i]:teleportTo(ze_zombieArenaStartPosition) spectator[i]:registerEvent("ZombiePlayerDeath") end Game.broadcastMessage("Zombie Event has started, good luck to all participants.") setZombieEventState(ze_EVENT_STARTED) addEvent(startZombieInvasion, ze_timeToStartInvasion * 1000) end -- Remove Teleport local item = Tile(ze_createTeleportPosition):getItemById(1387) if item:isTeleport() then item:remove() end end function startZombieInvasion() if getZombieEventState() == ze_EVENT_STARTED then local random = math.random local zombie = Game.createMonster(ze_zombieName, Position(random(ze_arenaFromPosition.x, ze_arenaToPosition.x), random(ze_arenaFromPosition.y, ze_arenaToPosition.y), random(ze_arenaFromPosition.z, ze_arenaToPosition.z))) if zombie then Game.setStorageValue(ze_zombieCountGlobalStorage, getZombieEventZombieCount() + 1) end addEvent(startZombieInvasion, ze_zombieSpawnInerval * 1000) end end function Player.joinZombieEvent(self) -- Set storage and teleport self:teleportTo(ze_WaitingRoomStartPosition) ze_WaitingRoomStartPosition:sendMagicEffect(CONST_ME_TELEPORT) self:setStorageValue(ze_joinStorage, 1) -- Add count and broadcast local count = getZombieEventJoinedCount() Game.setStorageValue(ze_joinCountGlobalStorage, count + 1) Game.broadcastMessage(string.format("%s has joined the Zombie Event! [%d/%d].", self:getName(), count + 1, ze_maxPlayers)) end function setupZombieEvent(minPlayers, maxPlayers, waitTime) -- Event is not closed, then stop from start new one if getZombieEventState() ~= ze_EVENT_CLOSED then return end -- Create teleport and set the respective action id local item = Game.createItem(1387, 1, ze_createTeleportPosition) if item:isTeleport() then item:setAttribute(ITEM_ATTRIBUTE_ACTIONID, ze_teleportActionId) end -- Change the variables, to the new ones ze_minPlayers = minPlayers ze_maxPlayers = maxPlayers ze_waitTime = waitTime -- Set the counts, state, broadcast and delay the start of the event. Game.setStorageValue(ze_zombieCountGlobalStorage, 0) Game.setStorageValue(ze_joinCountGlobalStorage, 0) setZombieEventState(ze_EVENT_STATE_STARTUP) Game.broadcastMessage(string.format("The Zombie Event has started! The event require atleast %d and max %d players, you have %d minutes to join.", minPlayers, maxPlayers, waitTime)) addEvent(startZombieEvent, waitTime * 60 * 1000) end data/monsters/Zombie Event.xml Spoiler <?xml version="1.0" encoding="UTF-8"?> <monster name="Zombie" nameDescription="a zombie" race="undead" experience="0" speed="150" manacost="0"> <health now="10000" max="10000" /> <look type="311" corpse="0" /> <targetchange interval="4000" chance="10" /> <flags> <flag summonable="0" /> <flag attackable="1" /> <flag hostile="1" /> <flag illusionable="0" /> <flag convinceable="0" /> <flag pushable="0" /> <flag canpushitems="1" /> <flag canpushcreatures="1" /> <flag targetdistance="1" /> <flag staticattack="90" /> <flag runonhealth="0" /> </flags> <attacks> <attack name="melee" interval="2000" min="0" max="-1000" /> </attacks> <defenses armor="15" defense="15" /> <elements> <element firePercent="50" /> </elements> <immunities> <immunity death="1" /> <immunity energy="1" /> <immunity ice="1" /> <immunity earth="1" /> <immunity drown="1" /> <immunity drunk="1" /> <immunity lifedrain="1" /> <immunity paralyze="1" /> </immunities> <voices interval="5000" chance="10"> <voice sentence="Mst.... klll...." /> <voice sentence="Whrrrr... ssss.... mmm.... grrrrl" /> <voice sentence="Dnnnt... cmmm... clsrrr...." /> <voice sentence="Httt.... hmnnsss..." /> </voices> <script> <event name="ZombieOnDeath"/> </script> </monster>
Postado Março 6, 2016 9 anos funciona em tfs 1.2? ai show funciono so que quando cai na arena n da respawn do zombie
Postado Março 31, 2016 9 anos Desculpe perguntar, mas qual os horarios que começa? Como programo isso?
Postado Maio 11, 2016 9 anos Em 30/12/2015 at 18:37, Azhaurn disse: dofile('data/zombieEvent.lua') meu ot nao tem esta pasta data, qual seria o destinatário pra este bloco???? REP++
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.