Postado Março 14, 2016 9 anos Bom vou explica qual duvida se puder me ajuda agradeço muito, tenho esse script de evento que funciona muito perfeitamente no qual foi designado sem nenhum bug. Porem ele me atrapalha em um pequeno quesito, esse script é um mod, se eu colocar ele no servidor e abri acontece seguinte bug. Player FULANO tem uma boots que heala 1k por segundo de HP, se ele coloca a boots vai healar normalmente, porem se ele deslogar e loga com a boots equipada, ela nao funciona mais tenho que retirar a boots e colocar novamente, ISSO PRA MIM E UM BUG porque ter que tira a boots e coloca denovo para ela funciona e um BUG. Se eu retirar o script mod e abri o servidor sem ele, volta ao normal, posso deslogar e loga o char com a boots equipada que continua healando normalmente. Então deve ter algo no script que ocasione o bug, se poderem identificar e me dizer como arruma agradeço muito pois quero esse script no meu servidor. Spoiler <?xml version="1.0" encoding="UTF-8"?> <mod name="Team Event" version="2.0" author="Damadgerz" contact="[email protected]" enabled="yes"> <description> Full auto Team BattleEvent(v2.0) for 0.4 : 1- I currently rescripted this event from scratch again. 2- This version is much more better than the one before, it is more cleaner, clearer and with more options. 3- This version was tested on 0.4 latest one 4626, should work on lower rev too. 4- Removed the npc part it is now based on tp creation. 5- More silent boradcasting for in event progress and no spam, I hope! 6- you now get the options to show event stats on cancel msg area and (to / not to) show left players with names each x interval. 8- Team balancer have been added to only balance count in both teams. 9- Added a countdown option before fight starts. 10- Now starts on a defined time every day </description> <config name="teamSetting"><![CDATA[ --[[Local Config]]-- --//storages inBlue = 9900 inRed = 9901 joiner = 9907 blueKills = 9902 redKills = 9903 eventRecruiting = 9904 eventStarted = 9905 eventTime = 9906 itemToGet = 9908 countItemToGet = 9909 nextExecute = 9910 blueCount = 9911 redCount = 9912 --// Positions teleporterPosition = {x = 161, y = 52, z = 7} waitRoomPlace = {x = 500, y = 872, z = 7} waitRoomDimensions = { startPos = {x = 493, y = 866, z = 7}, endPos = {x = 508, y = 877, z = 7} } eventPlaceDimensions = { startPos = {x = 521, y = 860, z = 7}, endPos = {x = 594, y = 899, z = 7} } blueTeamPos = {x = 525, y = 871, z = 7} redTeamPos = {x = 589, y = 872, z = 7} --// General settings recruitTime = 1 minimumPlayersJoins = 2 balanceTeams = true removeTeleportOnEventEnd = true eventMaxTime = 5 showEventSats = true sendLeftPlayers = true intervalToSendLeftPlayers = 11 countDownOnStart = true countDownFrom = 10 minJoinLevel = 50 rewards = { [85] = { {12710,1} }, [55] = { {12709,1} }, [50] = { {12701,1} } } ]]></config> <lib name="teamFunctions"><![CDATA[ domodlib('teamSetting') --[[Conditions don't touch]]-- local bmale = createConditionObject(CONDITION_OUTFIT) setConditionParam(bmale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(bmale, {lookType = math.random(128,134), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3}) local bfemale = createConditionObject(CONDITION_OUTFIT) setConditionParam(bfemale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(bfemale, {lookType = math.random(136,142), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3}) local rmale = createConditionObject(CONDITION_OUTFIT) setConditionParam(rmale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(rmale, {lookType = math.random(128,134), lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3}) local rfemale = createConditionObject(CONDITION_OUTFIT) setConditionParam(rfemale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(rfemale, {lookType = math.random(136,142),lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3}) local infight = createConditionObject(CONDITION_INFIGHT,-1) --[[Local Config]]-- --[[Functions]]-- -- General info function isFightOn() return getStorage(eventStarted) > 0 end function isRecruitOn() return getStorage(eventRecruiting) > 0 end function getMinJoinLevel() return minJoinLevel end function getJoiners() joiners = {} for _,cid in ipairs(getPlayersOnline()) do if isJoiner(cid) then if isInRecruitArea(cid) or isInFightArea(cid) then table.insert(joiners,cid) end end end return joiners end function getLeftMembersNames(team) str = "Oponents left("..#team..") :" left = "" for k,cid in ipairs(team) do left = (left ..""..(k == 1 and "" or ", ")..""..getCreatureName(cid).."["..getPlayerLevel(cid).."]" ) end str = str .." " .. (left == "" and "none" or left).. "." return str end function disPlayEventStats() if not showEventSats then return false end if getStorage(eventTime) - os.time() <= 0 then return false end left = os.date("%M:%S",(getStorage(eventTime) - os.time())) for _,cid in ipairs(getJoiners()) do oponentsLeft = isBlue(cid) and #getRedMembers() or #getBlueMembers() teamMatesLeft = isBlue(cid) and math.max(0,#getBlueMembers()-1) or math.max(0,#getRedMembers()-1) doPlayerSendCancel(cid,"Time left: ".. left.." || Oponents left: "..oponentsLeft.."/"..oponentCount(cid).." || Team-mates left: "..teamMatesLeft.."/".. math.max(0,matesCount(cid)-1)) end end function doSendLeftPlayers() if not sendLeftPlayers then return false end if intervalToSendLeftPlayers <= 10 then return false end for _,cid in ipairs(getJoiners()) do doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],getLeftMembersNames(isRed(cid) and getBlueMembers() or getRedMembers())) end end function getBlueMembers() members = {} for _,cid in ipairs(getPlayersOnline()) do if isBlue(cid) then table.insert(members,cid) end end return members end function getRedMembers() members = {} for _,cid in ipairs(getPlayersOnline()) do if isRed(cid) then table.insert(members,cid) end end return members end -- starting fight function startRecruiting() doSetStorage(eventRecruiting,1) end function startEvent() doSetStorage(eventRecruiting,-1) if removeTeleportOnEventEnd then tp = getTileItemById(teleporterPosition,1387).uid if tp > 0 then doRemoveItem(tp) end end if not balanceTeams() then resetEvent() return false end for _,cid in ipairs(getBlueMembers()) do doTeleportThing(cid,blueTeamPos,false) doSendMagicEffect(getThingPos(cid),10) end setBlueCount(#getBlueMembers()) for _,cid in ipairs(getRedMembers()) do doTeleportThing(cid,redTeamPos,false) doSendMagicEffect(getThingPos(cid),10) end setRedCount(#getRedMembers()) startCountDown() return true end function setBlueCount(count) doSetStorage(blueCount,-1) doSetStorage(blueCount,count) end function oponentCount(cid) return isBlue(cid) and getStorage(redCount) or getStorage(blueCount) end function matesCount(cid) return isBlue(cid) and getStorage(blueCount) or getStorage(redCount) end function setRedCount(count) doSetStorage(redCount,-1) doSetStorage(redCount,count) end function balanceTeams() members = getJoiners() if #members < minimumPlayersJoins then doBroadcastMessage("Team-Battle event was cancelled as only ".. #members .. " players joined.") return false end if (math.mod(#members,2) ~= 0) then kicked = members[#members] clearTeamEventStorages(kicked) doPlayerSendTextMessage(kicked,MESSAGE_TYPES["info"],"Sorry, you have been kicked out of event for balancing both teams.") end count = 1 for _,cid in ipairs(getJoiners()) do if (math.mod(count,2) ~= 0) then addToBlue(cid) else addToRed(cid) end count = count + 1 end return true end function startCountDown() if(countDownOnStart) then for _,cid in ipairs(getJoiners()) do doCreatureSetNoMove(cid,true) for i = 0,countDownFrom do addEvent(doPlayerSendTextMessage,i*1000, cid, MESSAGE_TYPES["info"], (i == 0 and countDownFrom or countDownFrom-i) ) end end addEvent(startFight,(countDownFrom+1)*1000) else startFight() end end function startFight() doSetStorage(eventStarted,1) for _,cid in ipairs(getJoiners()) do doCreatureSetNoMove(cid,false) doPlayerSendTextMessage(cid,MESSAGE_TYPES["warning"],"Fight Starts!") end addEvent(endTeamEvent,eventMaxTime*60*1000,"maxTime") doSetStorage(eventTime,os.time()+eventMaxTime*60) end function teleportToWaitRoom(cid) doTeleportThing(cid,waitRoomPlace) doSendMagicEffect(waitRoomPlace,10) if getPlayerGroupId(cid) < 4 then addToJoiners(cid) end doPlayerSendTextMessage(cid,MESSAGE_TYPES["blue"],"Please be patient till the event starts and don't logout.") return true end -- Modifing teams & checking member states function isBlue(cid) return (getPlayerStorageValue(cid,inBlue) > 0) end function isRed(cid) return (getPlayerStorageValue(cid,inRed) > 0) end function isJoiner(cid) return (getPlayerStorageValue(cid,joiner) > 0) end function addToBlue(cid) setPlayerStorageValue(cid,inBlue,1) doAddCondition(cid, (getPlayerSex(cid) == 1) and bmale or bfemale) doAddCondition(cid,infight) end function addToRed(cid) setPlayerStorageValue(cid,inRed,1) doAddCondition(cid, (getPlayerSex(cid) == 1) and rmale or rfemale) doAddCondition(cid,infight) end function addToJoiners(cid) setPlayerStorageValue(cid,joiner,1) end function removeFromBlue(cid) setPlayerStorageValue(cid,inBlue,-1) end function removeFromRed(cid) setPlayerStorageValue(cid,inRed,-1) end function removeFromjoiners(cid) setPlayerStorageValue(cid,joiner,-1) end function isInRecruitArea(cid) return isInRange(getThingPos(cid),waitRoomDimensions.startPos,waitRoomDimensions.endPos) end function isInFightArea(cid) return isInRange(getThingPos(cid),eventPlaceDimensions.startPos,eventPlaceDimensions.endPos) end function clearTeamEventStorages(cid) if isInRecruitArea(cid) or isInFightArea(cid) then doTeleportThing(cid,getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getThingPos(cid),10) end if isFightOn() then if isJoiner(cid) then if isBlue(cid) then addRedKills() elseif isRed(cid) then addBlueKills() end doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"You have died in Team-Battle Event.") end end removeFromjoiners(cid) removeFromBlue(cid) removeFromRed(cid) doRemoveConditions(cid, false) end function haveUnrecivedReward(cid) return getPlayerStorageValue(cid,itemToGet) > 0 and getPlayerStorageValue(cid,countItemToGet) > 0 end function recieveLateReward(cid) if haveUnrecivedReward(cid) then if not doPlayerAddItem(cid,getPlayerStorageValue(cid,itemToGet),getPlayerStorageValue(cid,countItemToGet),false) then msg = "You need to free some space then relog to take your reward." doPlayerSendTextMessage(cid,MESSAGE_TYPES["warning"],msg) else setPlayerStorageValue(cid,itemToGet,-1) setPlayerStorageValue(cid,countItemToGet,-1) doPlayerSendTextMessage(cid,MESSAGE_TYPES["info"],"You have recieved your reward.") end end end -- Win or lose function thereIsAWinner() if redWon() or blueWon() then return true end return false end function blueWon() return( (#getBlueMembers() > 0 ) and ( #getRedMembers() == 0) ) end function redWon() return( (#getRedMembers() > 0) and (#getBlueMembers() == 0) ) end function isDraw() return #getBlueMembers() == #getRedMembers() end function getWinner() if #getBlueMembers() > #getRedMembers() then return {getBlueMembers(),getRedMembers(),"Blue team won."} elseif #getRedMembers() > #getBlueMembers() then return {getRedMembers(),getBlueMembers(),"Red team won."} else return { {},{},"it was a draw."} end end -- Adding kills function addBlueKills() doSetStorage(blueKills, math.max(1,getStorage(blueKills)+1)) end function addRedKills() doSetStorage(redKills, math.max(1,getStorage(redKills)+1)) end -- Ending event function endTeamEvent(type) if isFightOn() then doSetStorage(eventStarted,-1) doBroadcastMessage("Team-Battle event ended and "..getWinner()[3]) if not isDraw() then win(getWinner()[1],type) lose(getWinner()[2],type) else draw() end end addEvent(resetEvent,2 * 1000) --- tp player to home remove all storages and reset event global storages end function getPercent() rand= math.random(1,100) prev = 0 chosenItem = 0 for k, v in pairs(rewards) do if rand > prev and rand <= k+prev then chosenItem = k break else prev = k+prev end end return chosenItem end function generateReward(cid) percent = getPercent() if percent == 0 then print("Error in the reward item. Please inform Doggynub.") return true end randomizer = rewards[percent][math.random(1,#rewards[percent])] item = not tonumber(randomizer[1]) and getItemIdByName(randomizer[1]) or randomizer[1] count = isItemStackable(item) and math.min(randomizer[2],100) or 1 if item == nil or item == 0 then print("Error in the item format. Please inform Doggynub.") return true end msg = "You have won ".. (count == 1 and "a" or count) .." " .. getItemNameById(item) .. "" .. (count == 1 and "" or "s").."." if not doPlayerAddItem(cid,item,count,false) then msg = msg.. "You need to free some space then relog to take your reward." setPlayerStorageValue(cid,itemToGet,item) setPlayerStorageValue(cid,countItemToGet,count) end doPlayerSendTextMessage(cid,MESSAGE_TYPES["white"],msg) end function generateStatsMessage(cid, type, stats) msg = { ["KO"] = { ["win"] = "Event ended. Your team have won by killing all oponent's team members. You will recieve your reward shortly, check incoming messages.", ["lose"] = "Event ended. Your team have lost as the Oponent team killed all your team's members." }, ["maxTime"] = { ["win"] = "Event max-time finished and your team have won. You will recieve your reward shortly, check incoming messages.", ["lose"] = "Event max-time finished and your team have lost.", ["draw"] = "Event max-time finished and it is a draw.(no team won)" } } doPlayerSendTextMessage(cid,MESSAGE_TYPES["info"],msg[type][stats]) end function win(winners,type) for _,cid in ipairs(winners) do generateStatsMessage(cid, type, "win") generateReward(cid) end end function lose(losers,type) for _,cid in ipairs(losers) do generateStatsMessage(cid, type, "lose") end end function draw() for _,cid in ipairs(getJoiners()) do generateStatsMessage(cid, "maxTime", "draw") end end function resetEvent() doSetStorage(eventRecruiting,-1) doSetStorage(nextExecute,-1) doSetStorage(eventStarted,-1) doSetStorage(eventTime,-1) doSetStorage(blueKills,-1) doSetStorage(redKills,-1) for _,cid in ipairs(getPlayersOnline()) do if isBlue(cid) or isRed(cid) or isJoiner(cid) then clearTeamEventStorages(cid) end end end ]]></lib> <event type="login" name="teambattleLogin" event="script"><![CDATA[ domodlib('teamFunctions') function onLogin(cid) clearTeamEventStorages(cid) recieveLateReward(cid) registerCreatureEvent(cid, "teamEventStats") registerCreatureEvent(cid, "teambattleLogout") registerCreatureEvent(cid, "teambattleCombat") return true end ]]></event> <event type="combat" name="teambattleCombat" event="script"><![CDATA[ domodlib('teamFunctions') function onCombat(cid, target) if isFightOn() then if isBlue(cid) and isBlue(target) then return false end if isRed(cid) and isRed(target) then return false end end return true end ]]></event> <event type="logout" name="teambattleLogout" event="script"><![CDATA[ domodlib('teamFunctions') function onLogout(cid) clearTeamEventStorages(cid) if thereIsAWinner() then endTeamEvent("KO") end return true end ]]></event> <event type="statschange" name="teamEventStats" event="script"><![CDATA[ domodlib('teamFunctions') corpse_ids = { [0] = 3065, -- female [1] = 3058 -- male } function onStatsChange(cid, attacker, type, combat, value) if combat == COMBAT_HEALING then return true end if getCreatureHealth(cid) > value then return true end if isInFightArea(cid) and isFightOn() then if isBlue(cid) or isRed(cid) then corpse = doCreateItem(corpse_ids[getPlayerSex(cid)], 1, getThingPos(cid)) doCreateItem(2016, 2, getThingPos(cid)) clearTeamEventStorages(cid) doItemSetAttribute(corpse, "description", "You recognize "..getCreatureName(cid)..". He was killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item")..".\n[Team-Event kill]") doCreatureAddHealth(cid,getCreatureMaxHealth(cid)) if thereIsAWinner() then endTeamEvent("KO") end return false end end return true end ]]></event> <globalevent name = "teamBattleStart" time="18:32:00" event="script"><![CDATA[ domodlib('teamFunctions') function onTime() resetEvent() if getTileItemById(teleporterPosition,1387).uid < 1 then tp = doCreateItem(1387,1,teleporterPosition) doItemSetAttribute(tp, "aid", 9990) end startRecruiting() for i = 0, recruitTime-1 do addEvent(doBroadcastMessage, i * 60* 1000,"Team-Battle event is recruting players by entering event tp. Fight begins in "..(i == 0 and recruitTime or recruitTime-i).." minutes.",MESSAGE_TYPES["warning"]) end addEvent(startEvent, recruitTime * 60 * 1000) return true end ]]></globalevent> <globalevent name = "teamBattletime" interval="1" event="script"><![CDATA[ domodlib('teamFunctions') function onThink() if isFightOn() then disPlayEventStats() if getStorage(nextExecute) == -1 or getStorage(nextExecute) <= os.time() then doSendLeftPlayers() doSetStorage(nextExecute,os.time()+intervalToSendLeftPlayers) end end return true end ]]></globalevent> <movevent type="StepIn" actionid="9990" event="script"><![CDATA[ domodlib('teamFunctions') function onStepIn(cid, item, position, fromPosition) if not isRecruitOn() then doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"Event isn't currently opened.") doTeleportThing(cid,fromPosition) doSendMagicEffect(fromPosition,2) return true end if getPlayerLevel(cid) < getMinJoinLevel() then doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"Only players of level ".. getMinJoinLevel().. "+ can join this event.") doTeleportThing(cid,fromPosition) return true end teleportToWaitRoom(cid) return true end ]]> </movevent> </mod> Agradeço, muito se me ajudarem.
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.