Topico atualizado...
Novas modificações para serem feitas...
Em npc.cpp:
Procure:
li.itemId = intValue;
Embaixo adicione:
const ItemType& it = Item::items[li.itemId];
Também procure:
if(readXMLInteger(tmpNode, "subtype", intValue))
li.subType = intValue;
Embaixo adicione:
else
{
if(it.stackable)
li.subType = 1;
else if(it.isFluidContainer() || it.isSplash())
li.subType = 0;
}
Em item.cpp:
Procure:
s << "(";
if(!it.runeSpellName.empty())
s << "\"" << it.runeSpellName << "\", ";
s << "Charges:" << subType <<")";
Embaixo adicione:
if(!it.runeSpellName.empty())
s << "(\"" << it.runeSpellName << "\")";
Em luascript.cpp:
Procure por:
//getCreatureHealth(cid)
lua_register(m_luaState, "getCreatureHealth", LuaScriptInterface::luaGetCreatureHealth);
Substitua por:
//getItemParent(uid)
lua_register(m_luaState, "getItemParent", LuaScriptInterface::luaGetItemParent);
Também procure por:
int32_t LuaScriptInterface::luaGetCreatureHealth(lua_State* L)
{
//getCreatureHealth(cid)
ScriptEnviroment* env = getEnv();
if(Creature* creature = env->getCreatureByUID(popNumber(L)))
lua_pushnumber(L, creature->getHealth());
else
{
errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
lua_pushboolean(L, false);
}
return 1;
}
Substitua por:
int32_t LuaScriptInterface::luaGetItemParent(lua_State* L)
{
//getItemParent(uid)
ScriptEnviroment* env = getEnv();
Item* item = env->getItemByUID(popNumber(L));
if(!item)
{
errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND));
lua_pushnil(L);
return 1;
}
Item* container = item->getParent()->getItem();
pushThing(L, container, env->addThing(container));
return 1;
}
Em luascript.h:
Procure por:
static int32_t luaDoRemoveItem(lua_State* L);
Substitua por:
static int32_t luaGetItemParent(lua_State* L);
Arquivos para procurar e repassar:
Bom gente eu não gravei como era o antigo desse então procure uma frase e repasse
Em container.cpp:
Procure e repasse: Cylinder* Container::__queryDestination(int32_t& index, const Thing* thing, Item** destItem,
uint32_t&)
{
if(index == 254 /*move up*/)
{
index = INDEX_WHEREEVER;
*destItem = NULL;
Container* parentContainer = dynamic_cast<Container*>(getParent());
if(parentContainer)
return parentContainer;
return this;
}
else if(index == 255 /*add wherever*/){
index = INDEX_WHEREEVER;
*destItem = NULL;
}
else if(index >= (int32_t)capacity()){
/*
if you have a container, maximize it to show all 20 slots
then you open a bag that is inside the container you will have a bag with 8 slots
and a "grey" area where the other 12 slots where from the container
if you drop the item on that grey area
the client calculates the slot position as if the bag has 20 slots
*/
index = INDEX_WHEREEVER;
*destItem = NULL;
}
const Item* item = thing->getItem();
if(item == NULL){
return this;
}
if(item->isStackable()){
if(item->getParent() != this){
//try find a suitable item to stack with
uint32_t n = 0;
for(ItemList::iterator cit = itemlist.begin(); cit != itemlist.end(); ++cit){
if((*cit) != item && (*cit)->getID() == item->getID() && (*cit)->getItemCount() < 100){
*destItem = (*cit);
index = n;
return this;
}
++n;
}
}
}
if(index != INDEX_WHEREEVER){
Thing* destThing = __getThing(index);
if(destThing)
*destItem = destThing->getItem();
Cylinder* subCylinder = dynamic_cast<Cylinder*>(*destItem);
if(subCylinder){
index = INDEX_WHEREEVER;
*destItem = NULL;
return subCylinder;
}
}
return this;
}
Em item.cpp:
Procure e repasse:
void Item::setDefaultSubtype()
{
setItemCount(1);
const ItemType& it = items[id];
if(it.charges)
setCharges(it.charges);
}
Em player.cpp:
Procure e repasse:
Cylinder* Player::__queryDestination(int32_t& index, const Thing* thing, Item** destItem,
uint32_t& flags)
{
if(index == 0 /*drop to capacity window*/ || index == INDEX_WHEREEVER){
*destItem = NULL;
const Item* item = thing->getItem();
if(item == NULL){
return this;
}
//find an appropiate slot
std::list<Container*> containerList;
for(int i = SLOT_FIRST; i < SLOT_LAST; ++i){
Item* inventoryItem = inventory[i];
if(inventoryItem == tradeItem){
continue;
}
if(inventoryItem == tradeItem){
continue;
}
if(inventoryItem){
//try find an already existing item to stack with
if(inventoryItem != item && item->isStackable() && inventoryItem->getID() == item->getID() && inventoryItem->getItemCount() < 100){
*destItem = inventoryItem;
index = i;
return this;
}
//check sub-containers
else if(Container* subContainer = inventoryItem->getContainer()){
Cylinder* tmpCylinder = NULL;
int32_t tmpIndex = INDEX_WHEREEVER;
Item* tmpDestItem = NULL;
tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags);
if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){
index = tmpIndex;
*destItem = tmpDestItem;
return tmpCylinder;
}
containerList.push_back(subContainer);
}
}
//empty slot
else if(__queryAdd(i, item, item->getItemCount(), flags) == RET_NOERROR){
index = i;
*destItem = NULL;
return this;
}
}
//check deeper in the containers
for(std::list<Container*>::iterator it = containerList.begin(); it != containerList.end(); ++it){
for(ContainerIterator iit = (*it)->begin(); iit != (*it)->end(); ++iit){
if(Container* subContainer = (*iit)->getContainer()){
if(subContainer == tradeItem){
continue;
}
Cylinder* tmpCylinder = NULL;
int32_t tmpIndex = INDEX_WHEREEVER;
Item* tmpDestItem = NULL;
tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags);
if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){
index = tmpIndex;
*destItem = tmpDestItem;
return tmpCylinder;
}
}
}
}
return this;
}
Thing* destThing = __getThing(index);
if(destThing)
*destItem = destThing->getItem();
Cylinder* subCylinder = dynamic_cast<Cylinder*>(destThing);
if(subCylinder){
index = INDEX_WHEREEVER;
*destItem = NULL;
return subCylinder;
}
else
return this;
}
Novo download:
Items.xml (8.6): Clique aqui
Novo script de potion...
ele esta em testes... se der erro eu volto no antigo