Auto zwalnianie domków !
Wyczyść cały plik globalevents/scripts/save.lua, a następnie wklej do niego:
local requiredTime = 60 * 60 * 24 * 30
function onThink(interval, lastExecution)
doSaveServer()
local result_plr = db.getResult("SELECT * FROM `houses`;")
if(result_plr:getID() ~= -1) then
while(true) do
local owner = tonumber(result_plr:getDataInt("owner"))
local hid = tonumber(result_plr:getDataInt("id"))
local lastlogin = 0
local result = db.getResult("SELECT * FROM `players` WHERE `id` = ".. owner ..";")
if(result:getID() ~= -1) then
while(true) do
lastlogin = tonumber(result:getDataInt("lastlogin"))
if not(result:next()) then
break
end
end
result:free()
end
if lastlogin < os.time(t) - requiredTime then
setHouseOwner(hid, 0, true)
end
if not(result_plr:next()) then
break
end
end
result_plr:free()
end
return TRUE
end
Guild war System
Gdy już pobierzemy sobie pliki source trunka znajdujemy plik configure.ac i szukamy w nim
OPTIONAL_FLAGS=
""
zmieniamy na
OPTIONAL_FLAGS=
"-D__WAR_SYSTEM__"
szukamy plik ioguild.cpp i w nim szukamy linijkę
channel->talk("", SPEAK_CHANNEL_RA, s.str());
zmieniamy na
channel->talk("", SPEAK_CHANNEL_W, s.str());
w tabeli bazy danych po kolei dodajemy (pamiętajmy po kolei nie naraz)
CREATE TABLE IF NOT EXISTS `guild_wars` (
`id` INT NOT NULL AUTO_INCREMENT,
`guild_id` INT NOT NULL,
`enemy_id` INT NOT NULL,
`begin` BIGINT NOT NULL DEFAULT '0',
`end` BIGINT NOT NULL DEFAULT '0',
`frags` INT UNSIGNED NOT NULL DEFAULT '0',
`payment` BIGINT UNSIGNED NOT NULL DEFAULT '0',
`guild_kills` INT UNSIGNED NOT NULL DEFAULT '0',
`enemy_kills` INT UNSIGNED NOT NULL DEFAULT '0',
`status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `status` (`status`),
KEY `guild_id` (`guild_id`),
KEY `enemy_id` (`enemy_id`)
) ENGINE=InnoDB;
ALTER TABLE `guild_wars`
ADD CONSTRAINT `guild_wars_ibfk_1` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `guild_wars_ibfk_2` FOREIGN KEY (`enemy_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE;
ALTER TABLE `guilds` ADD `balance` BIGINT UNSIGNED NOT NULL AFTER `motd`;
CREATE TABLE IF NOT EXISTS `guild_kills` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`guild_id` INT NOT NULL,
`war_id` INT NOT NULL,
`death_id` INT NOT NULL
) ENGINE = InnoDB;
ALTER TABLE `guild_kills`
ADD CONSTRAINT `guild_kills_ibfk_1` FOREIGN KEY (`war_id`) REFERENCES `guild_wars` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `guild_kills_ibfk_2` FOREIGN KEY (`death_id`) REFERENCES `player_deaths` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `guild_kills_ibfk_3` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE;
ALTER TABLE `killers` ADD `war` INT NOT NULL DEFAULT 0;
Do talkactions.xml dopisujemy linijki
<talkaction words="/war" event="script" value="war.lua"/>
<talkaction words="/balance" event="script" value="balance.lua"/>
w scripts dodajemy plik war.lua i wnim
tak samo do scripts dodajemy balance.lua i w nim
W głównym folderze lib tworzymy plik 101-war.lua i w nim dajem
WAR_GUILD = 0
WAR_ENEMY = 1
Do pliku data/globalevents/scripts/init.lua lub start.lua dodaj następujący kod:
db.query("DELETE FROM `guild_wars` WHERE `status` = 0 AND `begin` < " .. (os.time() - 2 * 86400) .. ";")
db.query("UPDATE `guild_wars` SET `status` = 5, `end` = " .. os.time() .. " WHERE `status` = 1 AND `end` > 0 AND `end` < " .. os.time() .. ";")
W accmakerze dodajemy plik war.php i wnim
W index.php dodajemy
case "wars":
$topic = "Wars";
$subtopic = "wars";
include("war.php");
break;
W layouts/tibiacom/layout.php dodajemy
<a href='?subtopic=wars'>
<div id='submenu_war' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)'>
<div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>
<div id='ActiveSubmenuItemIcon_spells' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div>
<div class='SubmenuitemLabel'>War</div>
<div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>
</div>
</a>
I jeżeli wszystko dobrze zrobiliśmy to gotowe.
Wszystkie lalki działają na tfsach 0.4. Powinny także działać na niższych trunkach 0.3.6
Stamina doll:
w actions/script dodajemy plik: staminadoll.lua a w nim:
function onUse(cid, item, fromPosition, itemEx, toPosition)
local cfg = {}
cfg.refuel = 42 * 60 * 1000
if(getPlayerStamina(cid) >= cfg.refuel) then
doPlayerSendCancel(cid, "Your stamina is already full.")
else
doPlayerSetStamina(cid, cfg.refuel)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Your stamina has been refilled.")
doRemoveItem(item.uid)
end
return true
end
W actions xml dodajemy:
<action itemid="ID ITEMA JAKI MA BYĆ STAMINA" script="staminadoll.lua"/>
Addon doll:
do talkactions.xml dodajemy:
<talkaction words="!addon" event="script" value="addondoll.lua"/>
w talkactions/script dodajemy plik: addondoll.lua a w nim
function onSay(cid, words, param)
local femaleOutfits = { ["citzen"]={136}, ["hunter"]={137}, ["mage"]={138}, ["knight"]={139}, ["noblewoman"]={140}, ["summoner"]={141}, ["warrior"]={142}, ["barbarian"]={147}, ["druid"]={148}, ["wizard"]={149}, ["oriental"]={150}, ["pirate"]={155}, ["assassin"]={156}, ["beggar"]={157}, ["shaman"]={158}, ["norsewoman"]={252}, ["nightmare"]={269}, ["jester"]={270}, ["brotherhood"]={279}, ["demonhunter"]={288}, ["yalaharian"]={324}, ["warmaster"]={336}, ["wayfarer"]={366} }
local maleOutfits = { ["citzen"]={128}, ["hunter"]={129}, ["mage"]={130}, ["knight"]={131}, ["nobleman"]={132},["summoner"]={133}, ["warrior"]={134}, ["barbarian"]={143}, ["druid"]={144}, ["wizard"]={145}, ["oriental"]={146}, ["pirate"]={151}, ["assassin"]={152}, ["beggar"]={153}, ["shaman"]={154}, ["norsewoman"]={251}, ["nightmare"]={268}, ["jester"]={273}, ["brotherhood"]={278}, ["demonhunter"]={289}, ["yalaharian"]={325}, ["warmaster"]={335}, ["wayfarer"]={367} }
local msg = {"Command requires GOOD param!", "You dont have Addon Doll!", "Bad param!", "Full Addon Set sucesfully added!"}
local param = string.lower(param)
if(getPlayerItemCount(cid, 9693) > 0) then
if(param ~= "" and maleOutfits[param] and femaleOutfits[param]) then
doPlayerRemoveItem(cid, 9693, 1)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg[4])
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_GIFT_WRAPS)
if(getPlayerSex(cid) == 0)then
doPlayerAddOutfit(cid, femaleOutfits[param][1], 3)
else
doPlayerAddOutfit(cid, maleOutfits[param][1], 3)
end
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg[1])
end
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, msg[2])
end
end
Jester Doll - to będzie nasz addon doll. Jeżeli chcemy zmienić to musimy poszukać w skrypcie 9639 i zmienić na inne id.
Change Sex Doll:
w actions.xml dodajemy linijkę:
<action itemid="ID ITEMA JAKI MA BYĆ LALKA" script="changesexdoll.lua"/>
potem do actions/script dodajemy changesexdoll.lua i w nim
function onUse(cid, item, frompos, item2, topos)
if getPlayerSex(cid) == 0 then
doPlayerSetSex(cid, 1)
doRemoveItem(item.uid)
else
doPlayerSetSex(cid, 0)
doRemoveItem(item.uid)
end
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Zmieniles plec.")
end
Anty mc i mega bomb
w creaturescripts.xml
<event type="death" name="Aol" event="script" value="aol.lua"/>
<event type="login" name="AntiMC" event="script" value="antiMc.lua"/>
---------------------------------------------------------------------
w antiMc.lua
local config = {
seconds = 2, -- w sekundach, czas oznaczony jako opóźnienie reloga
onlyWithSameIP = "yes" -- dla wszystkich graczy ("no"), lub dla tego samego ip ("yes")
}
--DONT MODIFY
config.onlyWithSameIP = getBooleanFromString(config.onlyWithSameIP)
local m_lastLogin, m_lastIP = 0, 0
function onLogin(cid)
local timeNow, playerIP = os.time(), getPlayerIp(cid)
if(m_lastLogin + config.seconds >= timeNow and
(config.onlyWithSameIP == FALSE or m_lastIP == playerIP)) then
return FALSE
end
m_lastIP = playerIP
m_lastLogin = timeNow
return TRUE
end
-------------------------------------------------------------------------------
w antiMc2.lua
local function gtfoMC(p)
if #getPlayersByIp(getPlayerIp(p.pid)) >= p.max then
doRemoveCreature(p.pid)
end
return TRUE
end
function onLogin(cid)
addEvent(gtfoMC, 1000, {pid = cid, max = 1000 })
return TRUE
end