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

[8.54] tfs 0.3.6 szukama items upgrade

Nie edytowałem źródeł, używałem tylko tych funkcji które są, i zapewniam, że wszystkie działają.

Mój serwer jest serwerem RPG, nie będę robił tak, że sobie ktoś kupi i ulepszy najlepsze wyposażenie na serwerze i będzie wymiatał. Dlatego z każdym levelem podnosi ATK, DEF, ARM o 1, a żeby zapobiec serpent swordom 100 ATK maksymalnie można użyć go 5 razy na 1 przedmiocie.

W konfiguracji zawarłem extraattack, extradefense, speed, hitchance, attackspeed, ale nie używam. Jedynie nie zrobiłem rozszerzania itemów o magicpoints itp.

A moje podejście jest proste, LUA jest opensource, za darmo, OpenTibia jest opensource, za darmo ale czas to pieniądz. Są ludzie, którzy za darmo wrzucają swoje skrypty, sam wczoraj udostępniłem swój quest system oraz skull/frag remover. Ale kto będzie w przyszłości udostępniał jak przyszłe pokolenia tylko chcą a nie się uczą :p
 
Hermes
A więc nie jest to trudne wystarczy około godzina roboty.(oczywiście bez tych dodatków które ty dodałeś typu zmiana prędkości broni)
Ale przyznaj że sprawdzanie ataku jest zbugowane (dlatego wolę użyć własnej fukcji) ponieważ zwraca nil.
Dlatego dziwię się czemu nikt nie wklepał tego od boleści na forum.
Mam nadzieje że prędko to się nie stanie.
Niestety w DT nie dali możliwości ustawienia ataku itd. Więc tym sprawdzaniem warunków mogę się najwyżej podetrzeć.

Dzięki za odpowiedź hermes.
 
A moje podejście jest proste, LUA jest opensource, za darmo, OpenTibia jest opensource, za darmo ale czas to pieniądz. Są ludzie, którzy za darmo wrzucają swoje skrypty, sam wczoraj udostępniłem swój quest system oraz skull/frag remover. Ale kto będzie w przyszłości udostępniał jak przyszłe pokolenia tylko chcą a nie się uczą :p

Przyznam Ci tu rację.Ale co do "prszyszłych" pokoleń to na nie jeszcze przyjdzie czas :) No ale ok, nie będę nalegał, jak chcesz to nie udostępniaj. Dzięki przynajmniej za wskazówki.
 
Tu macie taką mega podpowiedź, jak wiecie ocb to napiszecie skrypt w 10 minut.
Code:
getItemAttribute(uid, type)
np. getItemAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "attack")
getItemInfo(itemid).type
np. getItemInfo(getItemIdByName("Magic Sword")).attack
doItemSetAttribute(uid, type, value)
np. doItemSetAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "defense", 666)
Zwróćcie uwagę na uid i itemid, ponieważ uid odnosi się do konkretnego przedmiotu, który należy wskazać, a itemid tylko do id itemu, którego dane pobiera z items.xml.
 
Last edited:
Ja się kompletnie nie znam na skryptach ale postaram się "pogłówkować" nad tym, wezme sobie pod przykład jakis inny skrypt i zobaczymy.
 
Hermes
Za duże wskazówki dajesz :]
Jak się nie myle z tymi slotami to chyba elf ci pomógł. Wystarczyło w google poszukać.
Ciekawe czy elf zamierza poprawić sprawdzanie ataku i obrony


#Grochu
Ewentualnie możesz robić itemki graczom ręcznie używając
doItemSetAttribute(itemex, "attack", ileataku ma mieć)
 
Nie no to się raczej mija z celem :p

#Edit
NIe mam pojęcia, ja się tym praktycznie nie zajmuje, to mnie przerasta:p Proboje to ciagle zrozumiec...

Tzn ta "podpowiedz" ktora napisales w zupelnosci rozumiem, lecz niestety nie umiem pisac skryptow i bym go po prostu nie dokonczyl. Wiec ja chyba odpuszcze... Jak nie mam pojecia o co chodzi to wole sie wogole do tego nie zabierac.

Ps. czy dobrze zrozumialem ze jak uid sie odnosi tylko do jednego przedmiotu to musialbym w skrypcie wypisywac wszystkie nazwy itemkow, ktore maja podlegac do "ulepszeniu" czyli np:

getItemInfo(getItemIdByName("Magic Sword")).attack,
getItemInfo(getItemIdByName("Sabre")).attack,
getItemInfo(getItemIdByName("Sword")).attack,

(Pewnie sie teraz ośmiesze) :p
 
Last edited:
Lol, czytajcie uważnie. Sprawdzenie ataku i obrony itemu, który mam w lewej ręce:
Code:
local item = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
getItemAttribute(item.uid, "attack")
getItemAttribute(item.uid, "defense")
 
getItemAttribute(item.uid, "defense")
getItemAttribute(item.uid, "attack")

to do armora też się tyczy?, np:
getItemAttribute(item.uid, "armor")

Tylko, ze wtedy rozumiem bedzie trzeba przerobic to:
local item = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
Wkoncu w lewym slocie nie znajdzie sie armor...

#edit
Cos nabazgralem.... na 99,999% zle ale zawsze mozna sprobowac, wkleje moze komus sie przyda ale watpie... (to tylko czesc)

local item = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
doItemSetAttribute(uid, type, value)
getItemAttribute(item.uid, "attack")
getItemAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "attack")
getItemInfo(itemid).type
getItemInfo(getItemIdByName("Magic Sword")).attack
doItemSetAttribute(uid, type, value)
getItemAttribute(item.uid, "defense")
doItemSetAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "defense", 666)
end
local item = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
doItemSetAttribute(uid, type, value)
getItemAttribute(item.uid, "attack")
getItemAttribute(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid, "attack")
getItemInfo(itemid).type
getItemInfo(getItemIdByName("Magic Sword")).attack
doItemSetAttribute(uid, type, value)
getItemAttribute(item.uid, "defense")
doItemSetAttribute(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid, "defense", 666)
end
end
 
Last edited:
W funkcji onUse jest takie coś jak przedmiot, na którym został użyty przedmiot, który wywołał funkcję. Ten parametr to jest itemEx.
Więc, jak użyłeś itemu A na itemie B, item A to jest item, a item B to itemEx.

Możesz wyciągać z tego uid i itemid, np.
Code:
doItemSetAttribute(itemEx.uid, "attack", 100)
Code:
getItemInfo(itemEx.itemid).armor

Zauważ, że jeżeli item nie ma np. ARMu, bo jest bronią, to funkcja zwróci 0, co jest bardzo logiczne, bo wartość ARMu broni jest RACZEJ zero :d
 
to bedzie np cos takiego?

local item = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
function onUse(cid, item, fromPosition, itemEx, toPosition)
doItemSetAttribute(uid, type, value)
getItemAttribute(item.uid, "attack")
getItemAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "attack")
getItemInfo(itemEx.itemid).attack
getItemInfo(getItemEx.IdByName("Magic Sword")).attack
doItemSetAttribute(itemEx.uid, "attack", 100)
getItemAttribute(itemEx.uid, "defense")
doItemSetAttribute(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid, "defense", 666)
end
 
Nie wiem po co się tak męczyć...
Zmieniłem komendy w cpp i teraz wszystko ładnie śmiga.

#Skrypt ZAWIERA BŁĘDY oraz jest jak narazie prosty nie ma żadnych ciekawych opcji.

Jak narazie macie to:
LUA:
Actions:
function onUse(cid, item, fromPosition, itemEx, toPosition)

local ile = 1
local attack = getItemAttribute(itemEx.uid, "atk")
local maxlv = 4

if itemEx.uid ~=0 and (getItemAttribute(itemEx.uid, "aid")+1) < maxlv then
descr = "Values: "
if((getItemAttribute(itemEx.uid, "atk") ~= 0) and (getItemAttribute(itemEx.uid, "def") ~= 0)) then
doItemSetAttribute(itemEx.uid, "attack", getItemAttribute(itemEx.uid, "atk")+1)
doItemSetAttribute(itemEx.uid, "aid", getItemAttribute(itemEx.uid, "aid")+1)
doItemSetAttribute(itemEx.uid, "def", getItemAttribute(itemEx.uid, "def")+1)
doSendMagicEffect(toPosition,CONST_ME_MAGIC_BLUE)


doPlayerSendCancel(cid,"Bron zostala ulepszona! Obecny jej poziom to ".. getItemAttribute(itemEx.uid, "aid")+1 .."")
doRemoveItem(item.uid,1)

elseif (getItemAttribute(itemEx.uid, "arm") ~= 0) then
doItemSetAttribute(itemEx.uid, "armor", getItemAttribute(itemEx.uid, "arm")+1)
doSendMagicEffect(toPosition,CONST_ME_MAGIC_BLUE)
doPlayerSendCancel(cid,"Element zbroi ulepszony! Obecny jej poziom to ".. getItemAttribute(itemEx.uid, "aid")+1 .."")
doRemoveItem(item.uid,1)
doItemSetAttribute(itemEx.uid, "aid", getItemAttribute(itemEx.uid, "aid")+1)
elseif ((getItemAttribute(itemEx.uid, "atk") == 0) and (getItemAttribute(itemEx.uid, "def") ~= 0)) then
doItemSetAttribute(itemEx.uid, "armor", getItemAttribute(itemEx.uid, "arm")+1)
doSendMagicEffect(toPosition,CONST_ME_MAGIC_BLUE)
doItemSetAttribute(itemEx.uid, "aid", getItemAttribute(itemEx.uid, "aid")+1)
doPlayerSendCancel(cid,"Tarcza zostala ulepszona! Obecny jej poziom to ".. getItemAttribute(itemEx.uid, "aid")+1 .."")
doRemoveItem(item.uid,1)

else
doPlayerSendCancel(cid,"Nie mozna tego ulepszyc!")
end
return TRUE
end
return FALSE
end


CPP
Szukamy:
int32_t LuaScriptInterface::luaGetItemAttribute(lua_State* L)

{
//GetItemAttribute(uid, val)
i usuwamy wszystko co jest pod nim aż dojdziemy do linijki
int32_t LuaScriptInterface::luaDoItemSetAttribute(lua_State* L)
{
//doItemSetAttribute(uid, key, value)


Następnie wklejamy tą zawartość
int32_t LuaScriptInterface::luaGetItemAttribute(lua_State* L)

{
//GetItemAttribute(uid, val)
std::string attr = popString(L);
uint32_t uid = popNumber(L);

ScriptEnviroment* env = getEnv();

Item* item = env->getItemByUID(uid);

if(!item)
{
errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND));
lua_pushboolean(L, false);
return 1;
}
///////////////////////////////////// string:
if(attr == "name")
{
lua_pushstring(L, item->getName().c_str());
return 1;
}

if(attr == "pluralname")
{
lua_pushstring(L, item->getPluralName().c_str());
return 1;
}

if(attr == "specialdescr")
{
lua_pushstring(L, item->getSpecialDescription().c_str());
return 1;
}

if(attr == "text")
{
lua_pushstring(L, item->getText().c_str());
return 1;
}

if(attr == "writer")
{
lua_pushstring(L, item->getWriter().c_str());
return 1;
}
///////////////////////////////////// int:
if(attr == "itemid")
{
lua_pushnumber(L, item->getID());
return 1;
}

if(attr == "aid")
{
lua_pushnumber(L, item->getActionId());
return 1;
}

if(attr == "uid")
{
lua_pushnumber(L, item->getUniqueId());
return 1;
}

if(attr == "charges")
{
lua_pushnumber(L, item->getCharges());
return 1;
}

if(attr == "fluidtype")
{
lua_pushnumber(L, item->getFluidType());
return 1;
}

if(attr == "duration")
{
lua_pushnumber(L, item->getDuration());
return 1;
}

if(attr == "dduration")
{
lua_pushnumber(L, item->getDefaultDuration());
return 1;
}

if(attr == "throw_range")
{
lua_pushnumber(L, item->getThrowRange());
return 1;
}

if(attr == "shoot_range")
{
lua_pushnumber(L, item->getShootRange());
return 1;
}

if(attr == "atk")
{
lua_pushnumber(L, item->getAttack());
return 1;
}

if(attr == "arm")
{
lua_pushnumber(L, item->getArmor());
return 1;
}

if(attr == "def")
{
lua_pushnumber(L, item->getDefense());
return 1;
}



if(attr == "slot_position")
{
if(item->getSlotPosition() & SLOTP_NECKLACE)
lua_pushnumber(L,1);
if(item->getSlotPosition() & SLOTP_HEAD)
lua_pushnumber(L,2);
if(item->getSlotPosition() & SLOTP_BACKPACK)
lua_pushnumber(L,3);
if(item->getSlotPosition() & SLOTP_LEFT)
lua_pushnumber(L,4);
if(item->getSlotPosition() & SLOTP_ARMOR)
lua_pushnumber(L,5);
if(item->getSlotPosition() & SLOTP_RIGHT)
lua_pushnumber(L,6);
if(item->getSlotPosition() & SLOTP_RING)
lua_pushnumber(L,7);
if(item->getSlotPosition() & SLOTP_LEGS)
lua_pushnumber(L,8);
if(item->getSlotPosition() & SLOTP_AMMO)
lua_pushnumber(L,9);
if(item->getSlotPosition() & SLOTP_FEET)
lua_pushnumber(L,10);
return 1;
}

if(attr == "hitchance")
{
lua_pushnumber(L, item->getHitChance());
return 1;
}


if(attr == "count")
{
lua_pushnumber(L, item->getItemCount());
return 1;
}




///////////////////////////////////////////// boolean:





std::cout << "[LuaScriptInterface::luaGetItemAttribute]: invalid item attribute." << std::endl;

}


Credits:
Aragornkk
Deaven
Kratos z otfans




Znane błędy:
#Z niewiadomego powodu silnik ładuje się jednak my tego nie widzimy.
# Mało funkcji
# Nie ma ograniczeń poziomowych więc można na upartego zrobić 100 atk itd. (Patrz 1 up) zamierzam to naprawić
# Są nieużywane localne ze względu że nie działają (trochę dziwne ale prawdziwe)
 
Last edited:
@up
przepraszam, rozumiem, że będzie trzeba skompilować silnik, tak? Jakie pliki będą potrzebne do komplacji, ściągnełem dev-cpp, lecz nie jestem pewny czy to jest to. I prosiłbym o wytłumaczenie jak się kompiluje (pierwszy raz to będę robił) lub o podanie jakiegoś poradniku, dziękuję.
 
@Aragornik
Gz, po co robić jeszcze raz coś co jest i działa.
 
Bo działa inaczej niż ja chce. A jak coś działa inaczej niż po mojej myśli to już wolę to wywalić.
Oczywiście polecam kupić od Hermesa skrypt ponieważ jest o niebo lepszy. Ten skrypt umieściłem tylko po to aby było że zrobiłem.
Skrypt Hermesa ma bardzo wiele ciekawych funkcji i jest ogółem ciekawy oraz nawiązuje do RPG.
 
Back
Top