Last active
April 15, 2020 23:24
-
-
Save Xaekai/4765a75f76a4a4a07f4bbe1d468fcb13 to your computer and use it in GitHub Desktop.
Some team battle event for TFS 0.x versions that support mods. Code heresies purged by inquisitor Lessaire.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<mod name="Rush Event" version="2.0.2.0" author="Lessaire" contact="https://otland.net/members/lessaire/" enabled="yes"> | |
<credits> | |
This cleaned and refactored version is brought to you by Lessaire. | |
There is so much wrong with this still, | |
but since this crap is out in the wild may as well do what I can | |
All I know is the original authors, whoever they were, should feel ashamed. | |
Original Credits: | |
Maybe ChaitoSoft.com | |
Maybe GarQet | |
Maybe someone else | |
I dont fucking care, this script is 8 years old. | |
</credits> | |
<notes> | |
This revision attempts to register the creatureEvents in the buffered login script at the bottom. | |
If for whatever reason that doesn't work, you need to just move them to your regular login.lua. | |
</notes> | |
<description> | |
------------------------------------------------------------------------------------------------- | |
Configuration Guide: | |
announce - Event start announcement message | |
whyBother - Announcement of cancellation due to insufficient participants | |
winnerRed - Announcement that red team has won event | |
winnerBlue - Announcement that blue team has won event | |
posLobby - Position of Event Lobby where participants muster | |
posTeamRed - Position of Red Team temple/start | |
posTeamBlue - Position of Blue Team temple/start | |
minLevel - Minimum player level to participate | |
minAttend - Minimum attendance to start event | |
maxAttend - Maximum attendance of the arena | |
scoreWin - Number of frags to win battle | |
prizeItem - ItemID of reward | |
prizeAmount - Quantity of reward | |
preamble - Delay minutes between announcement and commencement | |
results - Delay minutes to publish results | |
-- Global Storages | |
scoreRed - Number of frags scored by Red team | |
scoreBlue - Number of frags scored by Blue team | |
stateSignup - EventState: registration open | |
stateBegun - EventState: has commenced and is underway (2 globals for event state? noob shit) | |
stateAttend - EventState: attendance | |
stateIndice - EventState: current registration indice (for team assigning, noob shit) | |
inArena - PlayerState: Sent to event grounds | |
registered - PlayerState: Registered for event || EventState: Winning kill | |
onTeamRed - PlayerState: On Team Red | |
onTeamBlue - PlayerState: On Team Blue | |
------------------------------------------------------------------------------------------------- | |
</description> | |
<config name="eventConfig"><![CDATA[ | |
local eventName = "Rush Battle" -- Massive Team Battle Event | |
rushConfig = { | |
eventName = eventName, | |
announce = eventName .. " has been started! Have fun..", | |
whyBother = eventName .. " will not occur! Too few participants registered.", | |
winnerRed = eventName .. " is completed, Red Team has won!", | |
winnerBlue = eventName .. " is completed, Blue Team has won!", | |
posTeamRed = { x = 31504, y = 31652, z = 7 }, | |
posTeamBlue = { x = 31434, y = 31586, z = 7 }, | |
posLobby = { x = 31494, y = 31557, z = 7 }, | |
minAttend = 1, | |
maxAttend = 500, | |
minLevel = 50, | |
scoreWin = 3, | |
prizeItem = 2160, | |
prizeAmount = 10, | |
preamble = 5, | |
results = 5, | |
stateSignup = 39145, | |
stateBegun = 39146, | |
stateAttend = 39147, | |
stateIndice = 39148, | |
inArena = 39149, | |
registered = 39150, | |
onTeamRed = 39151, | |
onTeamBlue = 39152, | |
scoreRed = 39153, | |
scoreBlue = 39154, | |
teamRed = "Red Team", | |
teamBlue = "Blue Team", | |
joinHow = "You can join this epic event by writing this command in a protection zone: !battle", | |
outfitLock = "You cannot change your outfit during the event.", | |
errorClose = "At the moment there are no records for this event.", | |
errorLow = "Your level is too low to participate in this event.", | |
errorHere = "You are already registered in this event.", | |
errorSafe = "You must be in protection zone.", | |
errorFull = "Event is full", | |
} | |
-- Lobby wait should be at least 2 minutes | |
rushConfig.preamble = math.max(2, rushConfig.preamble) | |
]]></config> | |
<lib name="RushUtils"><![CDATA[ | |
function doPlayerRemoveDamagingConditions(cid) | |
local tmp = {1, 2, 4, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 32768, 65536} | |
for i = 1, #tmp do | |
if(hasCondition(cid, tmp[i])) then doRemoveCondition(cid, tmp[i]) end | |
end | |
return true | |
end | |
]]></config> | |
<globalevent name="Recognition" interval="30000" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onThink(interval, lastExecution, thinkInterval) | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1) then | |
for _, pid in ipairs(getPlayersOnline()) do | |
if getPlayerStorageValue(pid, rushConfig.registered) == 1 then | |
if(getPlayerStorageValue(pid, rushConfig.onTeamBlue) == 0) then | |
doSendAnimatedText(getCreaturePosition(pid), "RED TEAM", TEXTCOLOR_RED) | |
elseif(getPlayerStorageValue(pid, rushConfig.onTeamBlue) == 1) then | |
doSendAnimatedText(getCreaturePosition(pid), "BLUE TEAM", TEXTCOLOR_LIGHTBLUE) | |
end | |
end | |
end | |
return true | |
end | |
return true | |
end | |
]]></globalevent> | |
<talkaction words="!check" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onSay(cid, words, param, channel) | |
if getPlayerGroupId(cid) > 3 then | |
local red = getGlobalStorageValue(rushConfig.scoreRed) | |
local blue = getGlobalStorageValue(rushConfig.scoreBlue) | |
local nRed = rushConfig.teamRed | |
local nBlue = rushConfig.teamBlue | |
local limit = rushConfig.scoreWin | |
local message = "" | |
if blue < limit and red < limit then | |
message = string.format("%s: %s frags.\n%s: %s frags.\nMatch is under way to %s frags.", nRed, red, nBlue, blue, limit) | |
elseif blue >= limit then | |
message = string.format("%s scored %s/%s frags. %s should win.", nBlue, blue, limit, nBlue) | |
elseif red >= limit then | |
message = string.format("%s scored %s/%s frags. %s should win.", nRed, red, limit, nRed) | |
end | |
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, message) | |
return true | |
end | |
return true | |
end | |
]]></talkaction> | |
<talkaction words="!start" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onSay(cid, words, param, channel) | |
if getPlayerGroupId(cid) > 3 then | |
setGlobalStorageValue(rushConfig.stateIndice, 1) | |
setGlobalStorageValue(rushConfig.scoreBlue, 0) | |
setGlobalStorageValue(rushConfig.scoreRed, 0) | |
setGlobalStorageValue(rushConfig.stateSignup, 1) | |
setGlobalStorageValue(rushConfig.stateAttend, 0) | |
setGlobalStorageValue(rushConfig.stateBegun, 0) | |
local message = string.format("Attention! %s will start in %s minutes. %s", rushConfig.eventName, rushConfig.preamble, rushConfig.joinHow) | |
doBroadcastMessage(message, MESSAGE_STATUS_WARNING) | |
local function broadcaster( minutes ) | |
if(minutes == 1) then | |
doBroadcastMessage(rushConfig.eventName .. ", starts in a minute. Last chance to join: !battle", MESSAGE_STATUS_WARNING) | |
return true; | |
end | |
doBroadcastMessage(rushConfig.eventName .. ", starts in " .. minutes .. rushConfig.joinHow, MESSAGE_STATUS_WARNING) | |
end | |
if(rushConfig.preamble > 5) then addEvent(broadcaster, (rushConfig.preamble - 4) * 1000 * 60, 4) end | |
if(rushConfig.preamble > 4) then addEvent(broadcaster, (rushConfig.preamble - 3) * 1000 * 60, 3) end | |
if(rushConfig.preamble > 3) then addEvent(broadcaster, (rushConfig.preamble - 2) * 1000 * 60, 2) end | |
if(rushConfig.preamble > 2) then addEvent(broadcaster, (rushConfig.preamble - 1) * 1000 * 60, 1) end | |
addEvent(start, rushConfig.preamble * 1000 * 60) | |
return true | |
end | |
return true | |
end | |
function results() | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1) then | |
local red = getGlobalStorageValue(rushConfig.scoreRed) | |
local blue = getGlobalStorageValue(rushConfig.scoreBlue) | |
doBroadcastMessage(rushConfig.eventName .. " results:\nRed Team scored: ".. red .." frags.\nBlue Team scored: ".. blue .." frags.\nMatch is under way to ".. rushConfig.scoreWin .." frags.", MESSAGE_STATUS_WARNING) | |
addEvent(results, rushConfig.results * 1000 * 60) | |
end | |
end | |
function start() | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1 and getGlobalStorageValue(rushConfig.stateAttend) >= rushConfig.minAttend) then | |
doBroadcastMessage(rushConfig.announce, MESSAGE_STATUS_WARNING) | |
setGlobalStorageValue(rushConfig.stateBegun, 1) | |
addEvent(results, rushConfig.results * 1000 * 60) | |
for _, pid in ipairs(getPlayersOnline()) do | |
local myOutfit = getCreatureOutfit(pid) | |
local red = {lookType = myOutfit.lookType, lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = myOutfit.lookAddons} | |
local blue = {lookType = myOutfit.lookType, lookHead = 86, lookBody = 86, lookLegs = 86, lookFeet = 86, lookTypeEx = 0, lookAddons = myOutfit.lookAddons} | |
if getPlayerStorageValue(pid, rushConfig.registered) == 1 then | |
doCreatureAddHealth(pid, getCreatureMaxHealth(pid)) | |
doCreatureAddMana(pid, getCreatureMaxMana(pid)) | |
if((getPlayerStorageValue(pid, rushConfig.stateIndice) % 2) == 1) then | |
doCreatureChangeOutfit(pid, red) | |
setPlayerStorageValue(pid, rushConfig.inArena, 1) | |
doTeleportThing(pid, rushConfig.posTeamRed) | |
setPlayerStorageValue(pid, rushConfig.registered, 1) | |
setPlayerStorageValue(pid, rushConfig.onTeamBlue, 0) | |
setPlayerStorageValue(pid, rushConfig.onTeamRed, 1) | |
doSendMagicEffect(getCreaturePosition(pid), 10) | |
doPlayerSendTextMessage(pid, MESSAGE_EVENT_ADVANCE, "You are in RED TEAM!\nThis battle will continue up to ".. rushConfig.scoreWin .." frags!") | |
else | |
doCreatureChangeOutfit(pid, blue) | |
doTeleportThing(pid, rushConfig.posTeamBlue) | |
setPlayerStorageValue(pid, rushConfig.inArena, 1) | |
setPlayerStorageValue(pid, rushConfig.registered, 1) | |
setPlayerStorageValue(pid, rushConfig.onTeamBlue, 1) | |
setPlayerStorageValue(pid, rushConfig.onTeamRed, 0) | |
doSendMagicEffect(getCreaturePosition(pid), 10) | |
doPlayerSendTextMessage(pid, MESSAGE_EVENT_ADVANCE, "You are in BLUE TEAM!\nThis battle will continue up to ".. rushConfig.scoreWin .." frags!") | |
end | |
end | |
end | |
elseif(getGlobalStorageValue(rushConfig.stateAttend) < rushConfig.minAttend) then | |
doBroadcastMessage(rushConfig.whyBother, MESSAGE_STATUS_WARNING) | |
setGlobalStorageValue(rushConfig.stateSignup, -1) | |
for _, pid in ipairs(getPlayersOnline()) do | |
if getPlayerStorageValue(pid, rushConfig.registered) == 1 then | |
setPlayerStorageValue(pid, rushConfig.registered, -1) | |
doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid))) | |
doSendMagicEffect(getCreaturePosition(pid), CONST_ME_TELEPORT) | |
end | |
end | |
end | |
end | |
]]></talkaction> | |
<talkaction words="!battle" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onSay(cid, words, param, channel) | |
if not (getGlobalStorageValue(rushConfig.stateSignup) == 1 and getGlobalStorageValue(rushConfig.stateBegun) ~= 1) then | |
doPlayerSendCancel(cid, rushConfig.errorClose) | |
return true | |
end | |
if getPlayerLevel(cid) < rushConfig.minLevel then | |
doPlayerSendCancel(cid, rushConfig.errorLow) | |
return true | |
end | |
if not (getPlayerStorageValue(cid, rushConfig.registered) == -1) then | |
doPlayerSendCancel(cid, rushConfig.errorHere) | |
return true | |
end | |
if getTilePzInfo(getPlayerPosition(cid)) ~= true then | |
doPlayerSendCancel(cid, rushConfig.errorSafe) | |
return true | |
end | |
if getGlobalStorageValue(rushConfig.stateAttend) >= rushConfig.maxAttend then | |
doPlayerSendCancel(cid, rushConfig.errorFull .. " [" .. getGlobalStorageValue(rushConfig.stateAttend) .. " players]!") | |
return true | |
end | |
setGlobalStorageValue(rushConfig.stateAttend, getGlobalStorageValue(rushConfig.stateAttend)+1) | |
if getGlobalStorageValue(rushConfig.stateAttend) == rushConfig.maxAttend then | |
doPlayerSendCancel(cid, rushConfig.errorFull .. " [" .. getGlobalStorageValue(rushConfig.stateAttend) .. " players]!") | |
else | |
doBroadcastMessage("" .. getPlayerName(cid) .. " has joined to the " .. rushConfig.eventName .. "! Now, we have: " .. getGlobalStorageValue(rushConfig.stateAttend) .. " players!", 19) | |
end | |
setPlayerStorageValue(cid, rushConfig.registered, 1) | |
setPlayerStorageValue(cid, rushConfig.inArena, -1) | |
doTeleportThing(cid, rushConfig.posLobby) | |
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) | |
setPlayerStorageValue(cid, rushConfig.stateIndice, getGlobalStorageValue(rushConfig.stateIndice)) | |
setGlobalStorageValue(rushConfig.stateIndice, tonumber(getGlobalStorageValue(rushConfig.stateIndice))+1) | |
return true | |
end | |
]]></talkaction> | |
<event type="combat" name="RushCombat" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onCombat(cid, target) | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1) then | |
if isPlayer(cid) and isPlayer(target) then | |
if getPlayerStorageValue(cid, rushConfig.registered) == 1 and getPlayerStorageValue(target, rushConfig.registered) == 1 then | |
if getPlayerStorageValue(cid, rushConfig.onTeamBlue) == getPlayerStorageValue(target, rushConfig.onTeamBlue) then | |
return doPlayerSendCancel(cid, "Sorry, you may not attack your teammates.") and false | |
end | |
end | |
end | |
end | |
return true | |
end | |
]]></event> | |
<event type="attack" name="RushAttack" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onAttack(cid, target) | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1) then | |
if isPlayer(cid) and isPlayer(target) then | |
if getPlayerStorageValue(cid, rushConfig.registered) == 1 and getPlayerStorageValue(target, rushConfig.registered) == 1 then | |
if getPlayerStorageValue(cid, rushConfig.onTeamBlue) == getPlayerStorageValue(target, rushConfig.onTeamBlue) then | |
return doPlayerSendCancel(cid, "Sorry, you may not attack your teammates.") and false | |
end | |
end | |
end | |
end | |
return true | |
end | |
]]></event> | |
<event type="preparedeath" name="RushDead" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
domodlib('RushUtils') | |
function onPrepareDeath(cid, deathList) | |
if(not isPlayer(cid)) then | |
return true | |
end | |
if getPlayerStorageValue(cid, rushConfig.registered) == -1 then | |
return true | |
end | |
if getGlobalStorageValue(rushConfig.stateSignup) == 1 then | |
local strings = {""} | |
local j, position, corpse = 1, 1, 0 | |
for _, pid in ipairs(deathList) do | |
if isCreature(pid) == true then | |
strings[position] = j == 1 and "" or strings[position] .. ", " | |
strings[position] = strings[position] .. getCreatureName(pid) .. "" | |
j = j + 1 | |
else | |
strings[position] = j == 1 and "" or strings[position] .. ", " | |
strings[position] = strings[position] .."a field item" | |
j = j + 1 | |
end | |
end | |
local sex = (getPlayerSex(cid) == 0 and "She" or "He") | |
for i, str in ipairs(strings) do | |
if(str:sub(str:len()) ~= ",") then | |
str = str .. "." | |
end | |
desc = "You recognize " | |
desc = desc .. "" .. getCreatureName(cid) .. ". " .. sex .. " was killed by " .. str | |
end | |
if(getPlayerSex(cid) == 1) then | |
corpse = doCreateItem(3058, getCreaturePosition(cid)) | |
else | |
corpse = doCreateItem(3065, getCreaturePosition(cid)) | |
end | |
doItemSetAttribute(corpse, "description", desc) | |
if((getPlayerStorageValue(cid, rushConfig.stateIndice) % 2) == 1) then | |
setGlobalStorageValue(rushConfig.scoreBlue, getGlobalStorageValue(rushConfig.scoreBlue)+1) | |
else | |
setGlobalStorageValue(rushConfig.scoreRed, getGlobalStorageValue(rushConfig.scoreRed)+1) | |
end | |
local red = getGlobalStorageValue(rushConfig.scoreRed) | |
local blue = getGlobalStorageValue(rushConfig.scoreBlue) | |
local victoryRed = red >= rushConfig.scoreWin | |
local victoryBlue = blue >= rushConfig.scoreWin | |
local winner = victoryBlue or victoryRed | |
if (not winner) then | |
if((getPlayerStorageValue(cid, rushConfig.stateIndice) % 2) == 1) then | |
doTeleportThing(cid, rushConfig.posTeamRed) | |
doSendMagicEffect(getCreaturePosition(cid), 10) | |
doCreatureAddHealth(cid, getCreatureMaxHealth(cid), MAGIC_EFFECT_UNKNOWN, COLOR_UNKNOWN, true) | |
doCreatureAddMana(cid, getCreatureMaxMana(cid)) | |
doPlayerRemoveDamagingConditions(cid) | |
if getCreatureSkullType(cid) == SKULL_WHITE then | |
doCreatureSetSkullType(cid, 0) | |
end | |
else | |
doTeleportThing(cid, rushConfig.posTeamBlue) | |
doSendMagicEffect(getCreaturePosition(cid), 10) | |
doCreatureAddHealth(cid, getCreatureMaxHealth(cid), MAGIC_EFFECT_UNKNOWN, COLOR_UNKNOWN, true) | |
doCreatureAddMana(cid, getCreatureMaxMana(cid)) | |
doPlayerRemoveDamagingConditions(cid) | |
if getCreatureSkullType(cid) == SKULL_WHITE then | |
doCreatureSetSkullType(cid, 0) | |
end | |
end | |
else | |
local message = victoryBlue and rushConfig.winnerBlue or rushConfig.winnerRed | |
local team = victoryBlue and rushConfig.onTeamBlue or rushConfig.onTeamRed | |
doBroadcastMessage(message, MESSAGE_STATUS_WARNING) | |
for _, pid in ipairs(getPlayersOnline()) do | |
if(getPlayerStorageValue(pid, team) == 1) then | |
doPlayerAddItem(pid, rushConfig.prizeItem, rushConfig.prizeAmount) | |
end | |
end | |
end | |
-- With this kill, a team won | |
if winner then | |
setGlobalStorageValue(rushConfig.stateSignup, -1) | |
setGlobalStorageValue(rushConfig.stateBegun, -1) | |
local function decampPlayer(cid) | |
setPlayerStorageValue(cid, rushConfig.inArena, -1) | |
setPlayerStorageValue(cid, rushConfig.onTeamBlue, -1) | |
setPlayerStorageValue(cid, rushConfig.onTeamRed, -1) | |
setPlayerStorageValue(cid, rushConfig.registered, -1) | |
setPlayerStorageValue(cid, rushConfig.stateIndice, -1) | |
doCreatureAddHealth(cid, getCreatureMaxHealth(cid), MAGIC_EFFECT_UNKNOWN, COLOR_UNKNOWN, true) | |
doCreatureAddMana(cid, getCreatureMaxMana(cid)) | |
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) | |
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), true) | |
doPlayerRemoveDamagingConditions(cid) | |
end | |
decampPlayer(cid) | |
for _, pid in ipairs(getPlayersOnline()) do | |
if(getPlayerStorageValue(pid, rushConfig.registered) == 1) then decampPlayer(pid) end | |
end | |
return false | |
end | |
return false | |
end | |
return true | |
end | |
]]></event> | |
<event type="outfit" name="RushOutfit" event="script"><![CDATA[ | |
domodlib('eventConfig') | |
function onOutfit(cid, old, current) | |
if getPlayerGroupId(cid) > 3 then | |
return true | |
end | |
if(getGlobalStorageValue(rushConfig.stateSignup) == 1) then | |
if getPlayerStorageValue(cid, rushConfig.inArena) == 1 then | |
if getPlayerStorageValue(cid, rushConfig.registered) > -1 then | |
doPlayerSendCancel(cid, rushConfig.outfitLock) | |
return false | |
end | |
end | |
end | |
return true | |
end | |
]]></event> | |
<event type="login" name="RushReset" event="buffer"><![CDATA[ | |
domodlib('eventConfig') | |
-- Just in case anything strange happens, clean up player storage | |
setPlayerStorageValue(cid, rushConfig.inArena, -1) | |
setPlayerStorageValue(cid, rushConfig.onTeamBlue, -1) | |
setPlayerStorageValue(cid, rushConfig.onTeamRed, -1) | |
setPlayerStorageValue(cid, rushConfig.registered, -1) | |
setPlayerStorageValue(cid, rushConfig.stateIndice, -1) | |
-- This should work since this chunk is on the bottom of the file | |
registerCreatureEvent(cid, "RushCombat") | |
registerCreatureEvent(cid, "RushAttack") | |
registerCreatureEvent(cid, "RushDead") | |
registerCreatureEvent(cid, "RushOutfit") | |
_result = true | |
]]></event> | |
</mod> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment