• 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!

Podnoszenie przedmiotów.

GarQet

Own3d!
Joined
Feb 10, 2009
Messages
1,381
Solutions
14
Reaction score
81
Eloszka!
Także ten, mam problem ze skryptem i nie wiem jak sobie z nim poradzić. Może ktoś z was wpadnie na jakiś wyjebany pomysł i mi pomoże.
Skrypt ma polegać na tym, że gracz nie może podnosić(wkładać do BP, bag) przedmiotów o danym ID.
Szukałem na forum, nie znalazłem. Szukałem na necie, nie znalazłem.
Znalazłem nową funkcję Mock'a ( http://otland.net/f35/creaturescript-onmoveitem-moveitem-frompos-position-cid-96742/ ), która oczywiście nie działa, co mnie nie zdziwiło bo co drugi jego skrypt jest niepełny a na dodatek nie otrzymujemy oczekiwanego efektu.
Próbowałem za pomocą jego funkcji:
Lua:
local ItemID = {2222, 2651, 2653, 2220, 2655}

function onMoveItem(moveItem, frompos, position, cid)
if(isInArray(ItemID, moveItem.itemid)) then
	doPlayerSendCancel(cid, "You cannot drop this item!")
	return false
end
end
Efekt? Efekt jest taki, że gdy mam ten item w plecaku to go nie mogę już wyrzucić, zaś jeśli podniosę podobny z ziemi i będę chciał włożyć do plecaka to się włoży bezproblemowo. A skrypt powinien działa zupełnie na odwrót. Podnieść go nie mogę - włożyć do plecaka. Zaś z plecaka mogę wyrzucić na ziemię.
To co próbowałem z dostępnych opcji w TFSie:
Lua:
local ItemID = {2222, 2651, 2653, 2220, 2655}

function onRemoveItem(moveItem, tileItem, position, cid)

	if(isInArray(ItemID, moveItem.itemid)) then
		doPlayerSendCancel(cid, "You cannot drop this item!")
		return false
	end
end
Efekt? Efekt praktycznie zdumiewający, wszystko prawie działa jak powinno tylko bez jednego, przedmiot można włożyć do plecaka. A powinno się nie dać ponieważ jest return FALSE.
Ostatnia próba:
Lua:
local ItemID = {2222, 2651, 2653, 2220, 2655}

function onRemoveItem(moveItem, tileItem, position, cid)

	if(isInArray(ItemID, moveItem.itemid)) then
		doPlayerSendCancel(cid, "You cannot drop this item!")
		doRemoveItem(moveItem.uid, 1)
		doCreateItem(moveItem.itemid, 1, position)
		return false
	end
end
Efekt? Efekt zdumiewający, ale atrybutów które posiadał wkładany item do BP stracił je ponieważ został skasowany i ponownie stworzony. Próbowałem użyć funkcji doCopyItem, ale poległem, coś było nie halo (doCopyItem(moveItem.uid, true)).

No także próbę podjąłem, ale poległem.
Ma ktoś jakiś pomysł jak mi pomóc?
Wskazówka jakaś?
Z góry dziękówka!
 
[Error - MoveEvents Interface]
data/movements/scripts/max.lua:eek:nRemoveItem
Description:
data/lib/050-function.lua:448: attempt to index local 'item' (a number value)
stack traceback:
data/lib/050-function.lua:448: in function 'doCopyItem'
data/movements/scripts/max.lua:21: in function <data/movements/scripts/max.lua:3>
Lua:
doCopyItem(moveItem.uid, {"aid", "uid", "description"})
 
Gdy jest tak:
Lua:
doCopyItem(moveItem, {'aid', 'uid', 'description'})
Kasuje przedmiot, wywala komunikat, ale nie kopiuje, bez żadnych błędów.
Gdy jest tak:
Lua:
doCopyItem(moveItem[B].uid[/B], {'aid', 'uid', 'description'})
Wywala komunikat, nie kopiuje i nie kasuje, z błędem:
[Error - MoveEvents Interface]
data/movements/scripts/max.lua:eek:nRemoveItem
Description:
data/lib/050-function.lua:448: attempt to index local 'item' (a number value)
stack traceback:
data/lib/050-function.lua:448: in function 'doCopyItem'
data/movements/scripts/max.lua:21: in function <data/movements/scripts/max.lua:3>
 
A sproboj:
Code:
doPlayerAddItemEx(cid, doCopyItem(moveItem, {'aid', 'uid', 'description'}))

Albo:
Code:
doPlayerAddItemEx(cid, doCopyItem(moveItem, {'aid', 'uid', 'description'}).uid)
 
O ile się nie mylę to ta funkcja
doPlayerAddItemEx
da graczowi ten przedmiot. A ma być inaczej, gracz ma go nie dostać.
Przetestowałem to co dałeś.
Gdy jest tak:
Lua:
doPlayerAddItemEx(cid, doCopyItem(moveItem, {'aid', 'uid', 'description'}))
Wywala komunikat, nie kopiuje ale kasuje, z błędem:
[Error - MoveEvents Interface]
data/movements/scripts/max.lua:eek:nRemoveItem
Description:
data/lib/050-function.lua:448: attempt to index local 'item' (a number value)
stack traceback:
data/lib/050-function.lua:448: in function 'doCopyItem'
data/movements/scripts/max.lua:21: in function <data/movements/scripts/max.lua:3>
Gdy jest tak:
Lua:
doPlayerAddItemEx(cid, doCopyItem(moveItem, {'aid', 'uid', 'description'}).uid)
Wywala komunikat, przedmiot wędruje do BP, bez żadnych błędów.
 
Sprawdź tak:​
PHP:
doPlayerAddItemEx(cid, moveItem.uid)
Wywala komunikat, przedmiot zostaje skasowany, bez żadnych błędów.
Czyli brakuje go, kopia się nie wykonuje czy tam to co powinno.

EDIT
Jest ktoś w stanie pomóc? :(
Tracę już powoli jakiekolwiek nadzieje. Niektórzy z was naprawdę rozpierdalają LUA. Proszę pomóżcie.
 
Last edited:
Sprobuj onAdd
Próbowałem, ono działa zupełnie na odwrót. Skrypt zaczyna działa przy wyrzuceniu przedmiotu z np. plecaka. A mi chodzi o to aby wykonywało skrypt przy wkładaniu a nie wyjmowaniu.
 
Bump, proszę, pomóżcie w jakikolwiek sposób.
 
Bump, proszę, pomóżcie w jakikolwiek sposób.


W jakikolwiek hmmm to może poprostu wejdź w item editor i dat editor i po prostu zrób, żeby item nie był Moveable?xD

Bo skryptem to tak łatwo nie zrobisz, jedynie może
Code:
onAddItem(moveitem, tileitem, pos)

Ale jak chcesz i tak wyłączyć jakieś items id to już lepiej takie rzeczy zrobić w items otbm, naprawdę prościej i skuteczniej, w dodatku nie obciąży Ci to w żaden sposób serva... Bo niewiem np. co by było gdyby np. 20 graczy albo nawet 30 stanęło na jednej kratce i zaczęło dany przedmiot na taskerze przenosić do plecaka... Jakby jakaś funkcja miała kopiować na nowo items, to chyba by trochę obciązyło serva, chociaż mogę się mylić i jeśli się mylę to nie wjeżdżajcie na mnie tylko napiszcie i tyle.
Na razie sądzę, że edycja items otbm jest najlepszym rozwiązaniem dla Ciebie.
 
Ja Cie GarQet i tak nie rozumiem co ty wgl chcesz zrobic, wiec opisz to dokladnie to moze cos wymyslimy.
 
Nie zrozumieliście mnie... Bo ja w zasadzie nie opisałem wam działania całego skryptu z tego względu, że jest to większa plontanina.

Zatem, chcę stworzyć taki skrypt, który sprawdza czy dana postać posiada przy sobie jakiś przedmiot o tych ID = {2222, 2651, 2653, 2220, 2655}. Jeśli gracz już posiada jeden z przedmiotów w swoim plecaku (przy sobie) to przy chęci zaequppowania kolejnego (wrzucenia np. do backpack'a), skrypt nie pozwala mu na to. Czyli maksymalna ilość przedmiotów o tych ID = {2222, 2651, 2653, 2220, 2655} jest równa 1.
W zależności od ilości przedmiotów wykonuje skrypt, jeśli nie ma żadnego to pozwala wrzucić do bp, a jeśli już ma jeden to nie pozwala go włożyć do plecaka.
Zrozumiałe?

Proszę pomóżcie.
 
w źródle w kodzie dodawania do containera sprawdź czy ten container leży u playera i jeśli tak to sprawdź czy Player już ma taki item, jeśli ma to nie wykonaj przeniesienia
czy w lua się da? po edycji źródła na pewno, bez niekoniecznie, nie iwem nawet czy ktoś napisał odpowiedni event żeby to zrobić(hardcodowany będzie wydajniejszy więc nie ważne ;d)
 
Nie bardzo ogarniam C++ dlatego chyba nie będę potrafił wykorzystać twojego pomysłu zakius.

Jakieś inne pomysły?
 
w źródle w kodzie dodawania do containera sprawdź czy ten container leży u playera i jeśli tak to sprawdź czy Player już ma taki item, jeśli ma to nie wykonaj przeniesienia
czy w lua się da? po edycji źródła na pewno, bez niekoniecznie, nie iwem nawet czy ktoś napisał odpowiedni event żeby to zrobić(hardcodowany będzie wydajniejszy więc nie ważne ;d)

queryAdd() w player.cpp powinno zadzialac. player jest parentem/topparentem containera z tego co pamietam.
 
No fajnie, ale co będzie jak np.
Gracz podnosi items do bp ---> już więcej nie może ---> wyrzuca obok backpack ---> zakłada nowy backpack ---> wkłada items do niego ---> wyrzuca cały backpack do backpacka, który jest już na ziemi ---> podnosi bp

To jeszcze skrypt powinien sprawdzać wszystkie pojemniki, czy w nich nie leżą te items... No ale, jak player taki zapcha taki backpack tysiącem backpackow z tymi items i skrypt będzie najpierw przeglądał all containery i do tego gracz, lub nawet paru na 1 stacku zrobią to na taskerze, to chyba może chyba lekko zalagować...? Chyba, że masz ograniczenie cap'a to wtedy raczej zbyt dużo nie nałożą do bp, żeby wykonać taką próbę xD

Jeśli nie chcesz bawić się c++ to w lua łatwiej chyba by było po prostu zrobić funkcję, która po przeniesieniu do bp tego itemu i jeśli mamy już taki, po prostu by go usuwała, następnie tworzyła nowy na danej pozycji :D i też np. odsuwała gracza ileś kratek w bok, lub na daną pozycję by nie próbował zalagować niczego.
 
Back
Top Bottom