- Dołączył
- Luty 17, 2009
- Posty
- 96
- Liczba reakcji
- 12
Gdy robi?em du?o efekt?w i napis?w nad teleportami na moim OTS mia?em pewien problem. Ot?? ci??ko si? je dodawa?o w konfiguracji w Lua. Musia?em ci?gle przepisywa? x, y, z do pliku! Poza tym tylko hoster ma dost?p do skrypt?w. Dlatego napisa?em skrypt najlepiej rozwi?zuj?cy ten problem i du?o lepszy od innych. Zapisuje efekty w bazie danych i nie znikn? do czasu usuni?cia z bazy. Dzi? przedstawiam go Wam.
SKRYPT
1. Wersja dla posiadaj?cych silnik z folderem globalevents oraz talkactions:
2. ?atwiejsza wersja dla posiadaj?cych silnik z folderem mods:
Wklej do mods/efekty.xml:
Wklej do mods/scripts/efektyevent.lua pierwszy skrypt z punktu 1.
Wklej do mods/scripts/efekty.lua drugi skrypt z punktu 1.
U?YCIE
U?ycie skryptu jest niezwykle proste. Nie musisz niczego konfigurowa? albo dodawa? do bazy danych!
Wystarczy, ?e wejdziesz na posta? GM, CM lub GODa. U?ywaj nast?puj?cych komend:
Przyk?ady
1. Dodaj napis i efekt nad teleportem
Wpisz
SCREEN
SKRYPT
1. Wersja dla posiadaj?cych silnik z folderem globalevents oraz talkactions:
- Dodaj do data/globalevents/globalevents.xml:
HTML:<globalevent name="efekty" interval="20" script="efekty.lua"/> - Utw?rz data/globalevents/scripts/efekty.lua i wklej:
PHP:efekty = {} eventy = {} function efekt(i) if not efekty[i] then eventy[i] = nil return end doSendMagicEffect(efekty[i].pos, efekty[i].eff) addEvent(efekty[i].f, efekty[i].czas, i) end function tekst(i) if not efekty[i] then eventy[i] = nil return end doSendAnimatedText(efekty[i].pos, efekty[i].text, efekty[i].eff) addEvent(efekty[i].f, efekty[i].czas, i) end function onThink(interval, lastExecution, thinkInterval) if not executed then db.executeQuery( [==[CREATE TABLE IF NOT EXISTS `efekty` ( `id` INT NOT NULL AUTO_INCREMENT, `typ` ENUM('efekt', 'tekst') NOT NULL DEFAULT 'efekt', `tekst` TEXT NOT NULL, `kolor_efekt` INT NOT NULL DEFAULT '0', `czas` INT NOT NULL DEFAULT '1000', `x` INT NOT NULL, `y` INT NOT NULL, `z` INT NOT NULL, PRIMARY KEY (`id`) );]==]) executed = true end efekty = {} local eff = db.getResult("SELECT * FROM `efekty`") if eff:getID() ~= -1 then local i = 0 repeat efekty[i] = { pos = {x = eff:getDataInt('x'), y = eff:getDataInt('y'), z = eff:getDataInt('z')}, eff = eff:getDataInt('kolor_efekt'), czas = eff:getDataInt('czas'), text = eff:getDataString('tekst'), f = (eff:getDataString('typ') == 'efekt') and efekt or tekst } if not eventy[i] then addEvent(efekty[i].f, efekty[i].czas, i) eventy[i] = true end i = i + 1 until not(eff:next()) eff:free() end return true end - Dodaj do data/talkactions/talkactions.xml:
HTML:<talkaction log="yes" words="/effects" access="3" event="script" value="efekty.lua"/> <talkaction log="yes" words="/addeffect" access="3" event="script" value="efekty.lua"/> <talkaction log="yes" words="/addtext" access="3" event="script" value="efekty.lua"/> <talkaction log="yes" words="/reffect" access="3" event="script" value="efekty.lua"/> <talkaction log="yes" words="/gotoeffect" access="3" event="script" value="efekty.lua"/> - Utw?rz data/talkactions/scripts/efekty.lua i wklej:
PHP:info = { "Nie mozna ustawic odstepu %d milisekund. Uzycie odstepu %d sekund.", "Numer -- efekt -- czas -- pozycja", "%d. %s%d %d { x: %d y: %d z: %d }", "Nie ma efektow w bazie. Dodaj je komenda /addeffect lub /addtext", "Nie znaleziono efektu %s. /%s efekt efekt uzyskaj za pomoca /effects", "/reffect numer Usuwa efekt lub tekst z bazy. `efekt` to numer, tekst lub nazwa uzyskana za pomoca /effects. /reffect all usuwa wszystkie efekty z bazy", "/gotoeffect efekt Teleportuje do efektu lub tekstu. `numer` uzyskaj za pomoca /effects" } function getEffect(t) local tonum = tonumber(t) if tonum == nil then return db.getResult("SELECT * FROM `efekty` WHERE `tekst`='" .. t .. "' LIMIT 1;") else return db.getResult("SELECT * FROM `efekty` LIMIT " .. tonum-1 .. ", 1;") end end function Values(cid, t) local czas = tonumber(t[1]) local typ = tonumber(t[2]) local tekst = t[3] local pos = getCreatureLookPosition(cid) local pola = '' local val = '' if czas then if czas < 200 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[1]:format(czas, czas)) czas = czas * 1000 end pola = '`czas`, ' val = czas .. ', ' end if typ then pola = pola .. '`kolor_efekt`, ' val = val .. typ .. ', ' end if tekst then pola = pola .. '`tekst`, ' val = val .. "'" .. tekst .. "', " end return pola, val .. pos.x .. ", " .. pos.y .. ", " .. pos.z end function onSay(cid, words, param, channel) local t = string.explode(param, ",") local czas = tonumber(t[1]) local pola = '' local val = '' if words == '/addeffect' or words == 'addtext' then pola, wartosci = Values(cid, t) db.executeQuery("INSERT INTO `efekty` (`typ`, " .. pola .. "`x`, `y`, `z`) VALUES ('" .. ((words == '/addeffect') and 'efekt' or 'tekst') .. "', " .. wartosci .. ");") elseif words == '/effects' then local eff = db.getResult("SELECT * FROM `efekty`") if eff:getID() ~= -1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[2]) local i = 1 repeat local czas = eff:getDataInt('czas') local pos = {x = eff:getDataInt('x'), y = eff:getDataInt('y'), z = eff:getDataInt('z')} local typ = eff:getDataString('typ') local txt if typ == 'efekt' then txt = 'Efekt ' if eff:getDataString('tekst') ~= '' then txt = txt .. '"' .. eff:getDataString('tekst') .. '" ' end else txt = 'Tekst `' .. eff:getDataString('tekst') .. '` Kolor: ' end doPlayerSendTextMessage(cid, (typ == 'efekt') and MESSAGE_INFO_DESCR or MESSAGE_EVENT_ADVANCE, info[3]:format(i, txt, eff:getDataInt('kolor_efekt'), czas, pos.x, pos.y, pos.z)) i = i + 1 until not(eff:next()) eff:free() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[4]) end elseif words == '/reffect' then if param == 'all' then db.executeQuery("DELETE * FROM `efekty`;") elseif t[1] then local eff = getEffect(t[1]) if eff:getID() ~= -1 then db.executeQuery("DELETE FROM `efekty` WHERE `id`=" .. eff:getDataInt('id') .. ";") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[5]:format(t[1], "reffect")) end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[6]) end elseif words == '/gotoeffect' then if t[1] then local eff = getEffect(t[1]) if eff:getID() ~= -1 then doTeleportThing(cid, {x = eff:getDataInt('x'), y = eff:getDataInt('y'), z = eff:getDataInt('z')}) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[5]:format(t[1], "gotoeffect")) end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, info[7]) end end return true end
2. ?atwiejsza wersja dla posiadaj?cych silnik z folderem mods:
Wklej do mods/efekty.xml:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Efekty" version="1.0" author="rtoip aka CabroN" contact="rtoip tibia.net.pl" enabled="yes">
<globalevent name="efekty" interval="20" event="script" value="efektyevent.lua"/>
<talkaction log="yes" words="/effects;/addeffect;/addtext;/reffect;/gotoeffect" access="3" event="script" value="efekty.lua"/>
</mod>
Wklej do mods/scripts/efektyevent.lua pierwszy skrypt z punktu 1.
Wklej do mods/scripts/efekty.lua drugi skrypt z punktu 1.
U?YCIE
U?ycie skryptu jest niezwykle proste. Nie musisz niczego konfigurowa? albo dodawa? do bazy danych!
Wystarczy, ?e wejdziesz na posta? GM, CM lub GODa. U?ywaj nast?puj?cych komend:
- /effects
Wy?wietla list? wszystkich magicznych efekt?w oraz napis?w w bazie.
- /addeffect czas, typ, nazwa
Dodaje magiczny efekt kratk? przed Tob?. nazwa jest opcjonalna. typ taki sam jak w przypadku komendy /z typ
- /addtext czas, kolor, tekst
Jak wy?ej, lecz dodaje tekst. kolor i tekst takie same jak w przypadku komendy /y kolor, tekst
- /reffect efekt
Usuwa efekt lub tekst z bazy. efekt to numer, tekst lub nazwa uzyskana za pomoc? /effects. all jako numer usuwa wszystkie efekty z bazy
- /gotoeffect numer
Teleportuje do efektu lub tekstu. numer uzyskaj za pomoc? /effects
Przyk?ady
1. Dodaj napis i efekt nad teleportem
- Sta? przed teleportem
- Wpisz
Kod:/addeffect 2000, 10, tp1 /addtext 2000, 200, Monsters
Wpisz
Kod:
/reffect tp1
/reffect Monsters
SCREEN
| Notka moderatorska: |
| Skrypt bardzo dobry, przenosz? do dzia?u globalevents. |