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 = 9900inRed = 9901joiner = 9907 blueKills = 9902redKills = 9903 eventRecruiting = 9904eventStarted = 9905eventTime = 9906 itemToGet = 9908countItemToGet = 9909 nextExecute = 9910 blueCount = 9911redCount = 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 infofunction isFightOn() return getStorage(eventStarted) > 0endfunction isRecruitOn() return getStorage(eventRecruiting) > 0endfunction getMinJoinLevel() return minJoinLevelendfunction 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 joinersend 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 strendfunction 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())) endend function getBlueMembers() members = {} for _,cid in ipairs(getPlayersOnline()) do if isBlue(cid) then table.insert(members,cid) end end return membersendfunction getRedMembers() members = {} for _,cid in ipairs(getPlayersOnline()) do if isRed(cid) then table.insert(members,cid) end end return membersend -- starting fight function startRecruiting() doSetStorage(eventRecruiting,1)endfunction 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 trueend function setBlueCount(count) doSetStorage(blueCount,-1) doSetStorage(blueCount,count)endfunction oponentCount(cid) return isBlue(cid) and getStorage(redCount) or getStorage(blueCount)endfunction matesCount(cid) return isBlue(cid) and getStorage(blueCount) or getStorage(redCount)end function setRedCount(count) doSetStorage(redCount,-1) doSetStorage(redCount,count)endfunction 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 trueendfunction 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() endendfunction 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 trueend -- Modifing teams & checking member statesfunction isBlue(cid) return (getPlayerStorageValue(cid,inBlue) > 0)endfunction isRed(cid) return (getPlayerStorageValue(cid,inRed) > 0)endfunction isJoiner(cid) return (getPlayerStorageValue(cid,joiner) > 0)endfunction addToBlue(cid) setPlayerStorageValue(cid,inBlue,1) doAddCondition(cid, (getPlayerSex(cid) == 1) and bmale or bfemale) doAddCondition(cid,infight)endfunction addToRed(cid) setPlayerStorageValue(cid,inRed,1) doAddCondition(cid, (getPlayerSex(cid) == 1) and rmale or rfemale) doAddCondition(cid,infight)endfunction addToJoiners(cid) setPlayerStorageValue(cid,joiner,1)endfunction removeFromBlue(cid) setPlayerStorageValue(cid,inBlue,-1)endfunction removeFromRed(cid) setPlayerStorageValue(cid,inRed,-1)endfunction removeFromjoiners(cid) setPlayerStorageValue(cid,joiner,-1)endfunction isInRecruitArea(cid) return isInRange(getThingPos(cid),waitRoomDimensions.startPos,waitRoomDimensions.endPos)endfunction isInFightArea(cid) return isInRange(getThingPos(cid),eventPlaceDimensions.startPos,eventPlaceDimensions.endPos)endfunction 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) endfunction haveUnrecivedReward(cid) return getPlayerStorageValue(cid,itemToGet) > 0 and getPlayerStorageValue(cid,countItemToGet) > 0 endfunction 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 endend -- Win or losefunction thereIsAWinner() if redWon() or blueWon() then return true end return falseendfunction blueWon() return( (#getBlueMembers() > 0 ) and ( #getRedMembers() == 0) )endfunction redWon() return( (#getRedMembers() > 0) and (#getBlueMembers() == 0) )endfunction isDraw() return #getBlueMembers() == #getRedMembers()endfunction 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."} endend -- Adding killsfunction addBlueKills() doSetStorage(blueKills, math.max(1,getStorage(blueKills)+1))endfunction 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 storagesend 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 chosenItemend 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]) endfunction win(winners,type) for _,cid in ipairs(winners) do generateStatsMessage(cid, type, "win") generateReward(cid) endendfunction lose(losers,type) for _,cid in ipairs(losers) do generateStatsMessage(cid, type, "lose") endendfunction draw() for _,cid in ipairs(getJoiners()) do generateStatsMessage(cid, "maxTime", "draw") endend 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 endend ]]></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 trueend]]></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 trueend ]]></event> <event type="logout" name="teambattleLogout" event="script"><![CDATA[domodlib('teamFunctions') function onLogout(cid) clearTeamEventStorages(cid) if thereIsAWinner() then endTeamEvent("KO") end return trueend ]]></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 trueend ]]></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 trueend ]]></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 trueend ]]></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 trueend ]]> </movevent></mod> Agradeço muito se poderem me ajudar obrigado.
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.