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

How to make your server client 8.61 Tutorial

Download Sources and open resources.h, that's where you find it, but in order to edit it you need a compiler.
 
Yo I follow this EXACLY and when I try the .exe I get this error. "This application has failed to start because libgmp-3.dll was not found."
 
I later add the items in autostake sources so that when we create a new character, the first drops all items on the floor, would solve this?
 
mmm...

Initial AutoStacking Items (find functions and replace)

Tested only in 0.4

in container.cpp:

[cpp]
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;
}
[/cpp]

item.cpp

[cpp]
void Item::setDefaultSubtype()
{
setItemCount(1);
const ItemType& it = items[id];
if(it.charges)
setCharges(it.charges);
}
[/cpp]

in player.cpp

[cpp]
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;

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;
}
[/cpp]

Enjoy!

(i need help to make conjure runes in inventory instead the hands and apply another svn patch)

ADD REP++ PLEASE!


GetParent wont compile with 0.3, I've tried. Not without errors anyway
 
Can you be more specific as to where to put all of this stuff?
 
Just download the latest sources and compile. It has 8.62 and almost everything works perfectly as far as I can tell.
 
Just download the latest sources and compile. It has 8.62 and almost everything works perfectly as far as I can tell.

0.4 can't load on my 32bit os. "Server out of memory" because of the crappy OTBM loading.

So it would be nice to know exactly where to edit this stuff, what lines, etc..
 
0.4 can't load on my 32bit os. "Server out of memory" because of the crappy OTBM loading.

So it would be nice to know exactly where to edit this stuff, what lines, etc..

If I have some time over today, I'll make this tutorial a little bit more user friendly :P
 
Back
Top