[8.54] Lepsze kolorowe efekty i napisy!

Status
Zamknięty.

rtoip

Active User
Zarejestrowany
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:
  • 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
2. Usu? powy?sze efekty
Wpisz
Kod:
/reffect tp1
/reffect Monsters

SCREEN
zrzut_ekranu-Okno%20bez%20nazwy.png


Notka moderatorska:
Skrypt bardzo dobry, przenosz? do dzia?u globalevents.
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

A gdy serwer zostanie zrestartowany, to te efekty juz znikn??? Nigdzie sie nie zapisuj???
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

A gdy serwer zostanie zrestartowany, to te efekty juz znikn??? Nigdzie sie nie zapisuj???

W?a?nie o to chodzi, by te efekty nie znika?y nawet po stracie foldera z serwerem. S? zapisywane w bazie danych.
 
Ostatnia edycja:
Odp: [8.54] Lepsze kolorowe efekty i napisy!

W takim razie nie da?e? wpisu do bazy danych, bo mu chodzi?o o to, ?e jak dodasz komend? dany efekt, teoretycznie zapisuje si? w bazie danych, ale nie ma kolumny, w kt?rej ma to zapisywa?.

Pozdrawiam,
Sassin
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

Sassin jeste? ?lepy chyba skrypty tworzy tabele w?asn? w bazie danych serwera, skrypty ?adny jak na jego rozwi?zanie, ale s?dz? ?e nie potrzebne dodatkowe zamulanie bazy danych.
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

nie potrzebne dodatkowe zamulanie bazy danych.

U mnie przy 110 efektach zamula na 10 do 20 milisekund co 10 sekund - tego nikt nie zauwa?y. Mo?na zwi?kszy? interval do 30 albo 60. Dodam jeszcze zmienn? "executed" kt?ra b?dzie wskazywa?a czy sprawdzono za pierwszym razem baz?.

Chyba, ?e chodzi?o o zamulanie przez powi?kszenie bazy.
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

masz jakie? narz?dzie do sprawdzenia kt?ry skrypt szybciej si? wykona? Ja jednak jestem zwolennikiem przepisywania ka?dej pozycji oddzielnie w folderze LUA i nie miesza? tego z baz? danych. By? mo?e zosta?o mi jeszcze po 8.1 i jeszcze nie ufam bazom danych.
 
Odp: [8.54] Lepsze kolorowe efekty i napisy!

Na linuksie (debian/ubuntu):
Kod:
sudo apt-get install liblua5.1-socket2
Na windowsie: szukaj w google lua libsocket

W pierwszej linijce dodaj:
Kod:
require "socket"

W miejscu od kt?rego chcesz policzy? czas:
Kod:
local __czas__ = socket.gettime()

Na ko?cu:
Kod:
print(socket.gettime() - __czas__)

Wy?wietli r??nic? sekund, np.
0.011530160903931
czyli 11,5 milisekund
 
Ostatnia edycja:
Status
Zamknięty.
Back
Do góry