• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Problem z doTransformItem

Status
Not open for further replies.

frost2321232

New Member
Joined
Apr 14, 2011
Messages
6
Reaction score
0
Witam. Mam problem z funkcją doTransformItem w niżej podanym kodzie.
Code:
	itemt = getThing(1000)
	for i = 0, 60 do
		addEvent(
		function()
			local zegar = 60 - i
			if (zegar == 60) then
				doSendAnimatedText(toPosition, '01:00', TEXTCOLOR_WHITE)
			elseif (zegar < 10 ) then
				doSendAnimatedText(toPosition, '0:0'..zegar, TEXTCOLOR_WHITE)
			else
				doSendAnimatedText(toPosition, '0:'..zegar, TEXTCOLOR_WHITE)
			end
			
			if (i == 30) then
				doTransformItem(itemt.uid, 1422)
			elseif (i == 59) then
				doTransformItem(itemt.uid, 1423)
			end
		end, 
		1200*i)
	end
Chodzi o to, że podczas pierwszego użycia doTransformItem(itemt.uid, 1422) item zostaje zmieniony w podany w funkcji i UID zostaje również. A podczas drugiego użycia doTransformItem(itemt.uid, 1423) item zostaje przekształcony, ale żeby go zobaczyć trzeba dać reloga (albo wyjść poza obszar widzenia itemu) i nie zapisuje się UID.
Jeśli zmienię ID w doTransformItem(itemt.uid, 1423) na inne to działa poprawnie.
 
to jest błąd w silniku, że np. jak się zmieni podłoga to widać ją dopiero jak odejdziesz za ekran i potem wrócisz na niego
 
Up: ciekawe, że ja poduszki zmieniłem na podłogę i działa. 0.3.6 i 0.4a1 chyba też

domyślam się, że chodzi o misje z dreammer challange questa, ale tam zmieniasz ułożenie samych poduszek, a nie zmieniasz podłogi

patrz, np. na PoI jak jest kamień co rozwalasz kilofem to zamienia lawę w grunt, w niektórych tfs jest błąd, że zmianę tą widzisz dopiero jak relogniesz/wyjdziesz po za ekran i wrócisz
to nie jest błąd we wszystkich versjach tylko w 1 czy 2 z błędem

aha, nadal widzisz lawę ale możesz po niej przechodzić, tylko poprostu nie widzisz zmian wizualnych, że się zmieniła na grunt zanim nie wyjdziesz za ekran
 
domyślam się, że chodzi o misje z dreammer challange questa, ale tam zmieniasz ułożenie samych poduszek, a nie zmieniasz podłogi

patrz, np. na PoI jak jest kamień co rozwalasz kilofem to zamienia lawę w grunt, w niektórych tfs jest błąd, że zmianę tą widzisz dopiero jak relogniesz/wyjdziesz po za ekran i wrócisz
to nie jest błąd we wszystkich versjach tylko w 1 czy 2 z błędem

aha, nadal widzisz lawę ale możesz po niej przechodzić, tylko poprostu nie widzisz zmian wizualnych, że się zmieniła na grunt zanim nie wyjdziesz za ekran
To mogę zrozumieć jeszcze, że się nie zmienia wygląd ale denerwuje mnie to że znika UID z Itema i nie mogę dalej działać na nim.
W skrypcie chodziło o to, żeby po jakimś czasie zmieniło się puste miejsce na ognisko.
Pierwszy etap działa, zamienia na ognisko z drewnem (id: 1422) oraz zachowuje UID, ale już na palące się ognisko (id: 1423,1424,1425) UID znika.
C**j z tym, że trzeba wyjść poza obszar widzenia, ale to UID...

@edit
Dodam, że działam na silniku TFS 0.3.6 (klient 8.6)
 
Last edited:
podaj nazwę questu jeśli robisz z rl tibii, a jak jakiś custom to wytłumacz normalnie bez podawania skryptów to napiszę ci skrypt
 
podaj nazwę questu jeśli robisz z rl tibii, a jak jakiś custom to wytłumacz normalnie bez podawania skryptów to napiszę ci skrypt
Skrypt jest napisany tylko nie działa doTransformItem końcowy.
Ale okej, zobaczymy...
Ma to działać na takiej zasadzie, że klikamy na item 1421 (stworzony wcześniej w mapie) o jakimś UID. Następnie odlicza nad tym właśnie itemem (od 01:00[1min] do 00:00[0min]) używając funkcji doSendAnimatedText.
Po 30 sek przedmiot zamienia się w item.itemid == 1422, a po kolejnych 30 sekundach na item.itemid == 1423.
 
itemt = getThing(1000)

tym pobierasz item jako rzec po UID o numerze 1000 tak?

potem znowu sprawdzasz UID tego itemu .uid

tzn nie jestem pewnie czy to drugie UID sprawdza UID wpisywany czy UID jako numer każdego itemu, ale hmm zrób może

doTransformItem(1000, 1422)

doTransformItem(1000, 1423)

zamiast wpisywać itemt.uid to wpisz od razu UID, ale nie jestem pewien czy nie pierdole głupot, spróbuj
 
Próbowałem również wpisywać UID ręcznie oraz parametr z funkcji onUse (item.uid). I nic nie pomaga - zawsze znika UID na tym ognisku...
 
nie chcę mi się zbytnio myśleć

może zmień to na action id zamiast uid


wgl dziwnie jakoś zrobiłeś ten addevent

ja to bym zrobił

Lua:
local itemt = getThing(1000)
event_odliczania = addevent(odlicz(itemt), 1)

odlicz()
zegar = global storage value coś jak exhausted zrób funkcje, tylko dla globalnego storage
if zegar >= 1 then
                                if (zegar == 60) then
				doSendAnimatedText(toPosition, '01:00', TEXTCOLOR_WHITE)
			elseif (zegar < 10 ) then
				doSendAnimatedText(toPosition, '0:0'..zegar, TEXTCOLOR_WHITE)
			else
				doSendAnimatedText(toPosition, '0:'..zegar, TEXTCOLOR_WHITE)
			end
if (zegar == 30) then
				doTransformItem(itemt.uid, 1422)
			elseif (zegar == 59) then
				doTransformItem(itemt.uid, 1423)
			end
addEvent(odlicz(), 1)
elseif zegar < 1 then
doSendAnimatedText(toPosition, 'BUM!', TEXTCOLOR_WHITE)
end


tzn to nie jest skrypt tylko szkic, więc jak go wkleisz to nie będzie zapewne działał, ale chodzi mi o sposób

aha, pewnie ci nie działa z tym uid, bo jak robisz addEvent funkcje to musisz w niej zadeklarować rzeczy, które będziesz potem używał, czyli ten ITEMT
 
spróbuj zrobić jak napisałem z oparciem na globalstorage value

i potem robisz

np. w skrypcie onUse czy jak tam chcesz

robisz coś --> wywołuje się akcja:

setGlobalStorageValue(storage, 60) <--- 60 to czas
addEvent(nazwa funkcji, parametry uzywane w funkcji (czyli itemt), numer global storage value, 1)

nazwa funkcji(itemt, globalstoragevaluenr)
czas to id globalstoraga value (musisz to zrobic tak jak exhausted, tylko, że na global storagu, to się chyba robiło os.time coś takiego)
tutaj robisz warunek if czas >= 1 then
tutaj dalej robisz te warunki i robisz np.
do send magic efekt (pozycja, 'Sekund: ' .. czas)

potych wszystkich wysyłaniach efektu i transformach dodajesz linijke znowu
addEvent(nazwa funkcji, parametry uzywane w funkcji (czyli itemt), numer global storage value, 1)

a za nia dajesz

elseif czas < 1 then
do send magic efekt (pozycja, 'KONIEC ODLICZANIA')
end

dzięki takim warunkom event stale będzie się wykonywał dopóki nie minie 60 sekund
 
Możesz też w game.cpp, w funkcji Item* Game::transformItem, zmusić kod by usuwał stary item i nakładał na jego miejsce nowy. Wystarczy dodać warunek, o tutaj:
PHP:
if(curType.alwaysOnTop != newType.alwaysOnTop)
 
Status
Not open for further replies.
Back
Top