MAIN.DLL

CustomItemInfo.cpp
Código:
#include "stdafx.h"
#include "Defines.h"
#include "CustomItemInfo.h"
#include "InfoLog.h"

CCustomItemInfo gCustomItemInfo;

CCustomItemInfo::CCustomItemInfo() // OK
{
	this->Init();
}

CCustomItemInfo::~CCustomItemInfo() // OK
{

}

void CCustomItemInfo::Init() // OK
{
	for(int n=0;n < MAX_CUSTOM_ITEM_INFO;n++)
	{
		this->m_CustomItemInfoEx[n].Index = -1;
	}
}

void CCustomItemInfo::Load(CUSTOM_ITEM_INFO_EX* info) // OK
{
	for(int n=0;n < MAX_CUSTOM_ITEM_INFO;n++)
	{
		this->SetInfo(info[n]);
		
	}
}

void CCustomItemInfo::SetInfo(CUSTOM_ITEM_INFO_EX info) // OK
{
	if(info.Index < 0 || info.Index >= MAX_CUSTOM_ITEM_INFO)
	{
		return;
	}

	this->m_CustomItemInfoEx[info.Index] = info;
}

CUSTOM_ITEM_INFO_EX* CCustomItemInfo::GetInfo(int index) // OK
{
	if(index < 0 || index >= MAX_CUSTOM_ITEM_INFO)
	{
		return 0;
	}

	if(this->m_CustomItemInfoEx[index].Index != index)
	{
		return 0;
	}
	
	return &this->m_CustomItemInfoEx[index];
}

CUSTOM_ITEM_INFO_EX* CCustomItemInfo::GetInfoByItem(int ItemIndex) // OK
{
	for(int n=0;n < MAX_CUSTOM_ITEM_INFO;n++)
	{
		CUSTOM_ITEM_INFO_EX* lpInfo = this->GetInfo(n);

		if(lpInfo == 0)
		{
			continue;
		}

		if(ITEM(lpInfo->ItemType,lpInfo->ItemIndex) == ItemIndex)
		{
			gInfoLog.Output(LOG_KILLERS,"item %d,%d",this->m_CustomItemInfoEx[n].ItemType,this->m_CustomItemInfoEx[n].ItemIndex);
			return lpInfo;
		}
	}

	return 0;
}

bool CCustomItemInfo::isCustomItem(int ItemIndex,float* ItemColor) // OK
{
	return true;
}
CustomItemInfo.h
Código:
#pragma once

struct CUSTOM_ITEM_INFO_EX
{
	int Index;
	int ItemType;
	int ItemIndex;
	int DamageMin;
	int DamageMax;
	int Defense;
	int MagicDefense;
};

class CCustomItemInfo
{
public:
	CCustomItemInfo();
	virtual ~CCustomItemInfo();
	void Init();
	void Load(CUSTOM_ITEM_INFO_EX* info);
	void SetInfo(CUSTOM_ITEM_INFO_EX info);
	CUSTOM_ITEM_INFO_EX* GetInfo(int index);
	CUSTOM_ITEM_INFO_EX* GetInfoByItem(int ItemIndex);
	bool isCustomItem(int ItemIndex,float* ItemColor);
public:
	CUSTOM_ITEM_INFO_EX m_CustomItemInfoEx[MAX_CUSTOM_ITEM_INFO];
};

extern CCustomItemInfo gCustomItemInfo;
ItemInfoEx.cpp
Código:
#include "stdafx.h"
#include "ItemInfoEx.h"
#include "TMemory.h"
#include "Util.h"
#include "Defines.h"
#include "Import.h"
#include "Object.h"
#include "CustomItemInfo.h"
#include "InfoLog.h"

void SetNewOption(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value);

cItemInfoEx gItemInfoEx;

cItemInfoEx::cItemInfoEx() {

}

cItemInfoEx::~cItemInfoEx() {

}

void cItemInfoEx::Load() {

	SetOp((LPVOID)0x58B77E, SetNewOption, ASM::CALL);		//<- :c ?
	SetOp((LPVOID)0x5C7833, SetNewOption, ASM::CALL);		//<- :c ?
	SetOp((LPVOID)0x5C7D71, SetNewOption, ASM::CALL);		//<- :c ?
	SetOp((LPVOID)0x5C7F1B, SetNewOption, ASM::CALL);		//<- :c ?
	SetOp((LPVOID)0x5C80BE, SetNewOption, ASM::CALL);		//<- :c ?
	SetOp((LPVOID)0x7E22BA, SetNewOption, ASM::CALL);
}

void SetNewOption(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value) {
	
	pSetItemOption(lpItem, Option, Special, Value);

	CUSTOM_ITEM_INFO_EX* Exdata = gCustomItemInfo.GetInfoByItem(lpItem->ItemID);

	if (Exdata) {
		lpItem->DamageMin = Exdata->DamageMin;
		lpItem->DamageMax = Exdata->DamageMax;
		lpItem->Defense = Exdata->Defense;
		lpItem->MagicDefense = Exdata->MagicDefense;
		DWORD v6 = 0;
		DWORD v7 = 0;
		DWORD v8 = 0;
		DWORD v9 = 0;
		DWORD v10 = 0;
		DWORD v13 = 0;
		DWORD v14 = 0;
		int v16 = Special & 0x3F;
		signed int v17 = *(WORD *)pGetItemAtt(lpItem->ItemID, 32) + 30;
		char v22 = 0;
		int v24 = (Option >> 3) & 0xF;

		if (lpItem->ItemID >= 6147 && lpItem->ItemID <= 6150
			|| lpItem->ItemID >= 6180 && lpItem->ItemID <= 6184
			|| lpItem->ItemID >= 6186 && lpItem->ItemID <= 6187
			|| lpItem->ItemID == 19
			|| lpItem->ItemID == 2066
			|| lpItem->ItemID == 2570
			|| lpItem->ItemID == 1037
			|| lpItem->ItemID == 6686
			|| lpItem->ItemID >= 6274 && lpItem->ItemID <= 6278
			|| lpItem->ItemID >= 6193 && lpItem->ItemID <= 6194
			|| lpItem->ItemID == 6279
			|| lpItem->ItemID == 2596)
		{
			v16 = 0;
		}

		if (Value % 4 == 1 || Value % 4 == 2)
		{
			v16 = 1;
			v22 = 1;
		}

		signed int v18 = 0;

		switch (lpItem->ItemID)
		{
		case 0x406:
			v18 = 15;
			break;
		case 0x806:
			v18 = 30;
			break;
		case 0xA07:
			v18 = 25;
			break;
		}

		if (Exdata->DamageMin > 0)
		{
			if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
			{
				if (v18)
					lpItem->DamageMin += v18;
				else
					lpItem->DamageMin += (25 * Exdata->DamageMin / *(WORD *)pGetItemAtt(lpItem->ItemID, 32)) + 5;
			}
			if (v22)
				lpItem->DamageMin += v17 / 40 + 5;
			if (v24 <= 9)
				v14 = (Option >> 3) & 0xF;
			else
				v14 = 9;
			lpItem->DamageMin += 3 * v14;
			switch (v24)
			{
			case 15:
				lpItem->DamageMin += 9;
			case 14:
				lpItem->DamageMin += 8;
			case 13:
				lpItem->DamageMin += 7;
			case 12:
				lpItem->DamageMin += 6;
			case 11:
				lpItem->DamageMin += 5;
			case 10:
				lpItem->DamageMin += 4;
				break;
			default:
				break;
			}
		}
		if (Exdata->DamageMax > 0)
		{
			if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
			{
				if (v18)
					lpItem->DamageMax += v18;
				else
					lpItem->DamageMax += (25 * Exdata->DamageMax / *(WORD *)pGetItemAtt(lpItem->ItemID, 32)) + 5;
			}
			if (v22)
				lpItem->DamageMax += v17 / 40 + 5;
			if (v24 <= 9)
				v13 = (Option >> 3) & 0xF;
			else
				v13 = 9;
			lpItem->DamageMax += 3 * v13;
			switch (v24)
			{
			case 15:
				lpItem->DamageMax += 9;
			case 14:
				lpItem->DamageMax += 8;
			case 13:
				lpItem->DamageMax += 7;
			case 12:
				lpItem->DamageMax += 6;
			case 11:
				lpItem->DamageMax += 5;
			case 10:
				lpItem->DamageMax += 4;
				break;
			default:
				break;
			}
		}
		if (lpItem->ItemID == 6686) //???
		{
			lpItem->Defense = 15;
		}
		if (Exdata->Defense > 0)
		{
			if (lpItem->ItemID < 3072 || lpItem->ItemID >= 3584)
			{
				if (v16 > 0 && *(WORD *)pGetItemAtt(lpItem->ItemID, 32))
					lpItem->Defense += 12 * Exdata->Defense / *(WORD *)pGetItemAtt(lpItem->ItemID, 32) + *(WORD *)pGetItemAtt(lpItem->ItemID, 32) / 5 + 4;
				if (v22)
					lpItem->Defense += 3 * lpItem->Defense / v17 + v17 / 30 + 2;
				if ((lpItem->ItemID < 6147 || lpItem->ItemID > 6150) && lpItem->ItemID != 6186)
				{
					if (lpItem->ItemID != 6686 && lpItem->ItemID != 6193)
					{
						if ((lpItem->ItemID < 6180 || lpItem->ItemID > 6184)
							&& lpItem->ItemID != 6187
							&& lpItem->ItemID != 6194)
						{
							if (v24 <= 9)
								v7 = (Option >> 3) & 0xF;
							else
								v7 = 9;
							lpItem->Defense += 3 * v7;
						}
						else
						{
							if (v24 <= 9)
								v8 = (Option >> 3) & 0xF;
							else
								v8 = 9;
							lpItem->Defense += 4 * v8;
						}
					}
					else
					{
						if (v24 <= 9)
							v9 = (Option >> 3) & 0xF;
						else
							v9 = 9;
						lpItem->Defense += 2 * v9;
					}
				}
				else
				{
					if (v24 <= 9)
						v10 = (Option >> 3) & 0xF;
					else
						v10 = 9;
					lpItem->Defense += 2 * v10;
				}
				if ((lpItem->ItemID < 6180 || lpItem->ItemID > 6184)
					&& lpItem->ItemID != 6187
					&& lpItem->ItemID != 6194)
				{
					switch (v24)
					{
					case 15:
						lpItem->Defense += 9;
					case 14:
						lpItem->Defense += 8;
					case 13:
						lpItem->Defense += 7;
					case 12:
						lpItem->Defense += 6;
					case 11:
						lpItem->Defense += 5;
					case 10:
						lpItem->Defense += 4;
						break;
					default:
						break;
					}
				}
				else
				{
					switch (v24)
					{
					case 15:
						lpItem->Defense += 10;
					case 14:
						lpItem->Defense += 9;
					case 13:
						lpItem->Defense += 8;
					case 12:
						lpItem->Defense += 7;
					case 11:
						lpItem->Defense += 6;
					case 10:
						lpItem->Defense += 5;
						break;
					default:
						break;
					}
				}
			}
			else
			{
				lpItem->Defense += v24;
				if (v22)
					lpItem->Defense += (unsigned int)(20 * lpItem->Defense / v17) + 2;
			}
		}
		if (Exdata->MagicDefense > 0)
		{
			if (v24 <= 9)
				v6 = (Option >> 3) & 0xF;
			else
				v6 = 9;
			lpItem->MagicDefense += 3 * v6;
			switch (v24)
			{
			case 15:
				lpItem->MagicDefense += 9;
			case 14:
				lpItem->MagicDefense += 8;
			case 13:
				lpItem->MagicDefense += 7;
			case 12:
				lpItem->MagicDefense += 6;
			case 11:
				lpItem->MagicDefense += 5;
			case 10:
				lpItem->MagicDefense += 4;
				break;
			default:
				break;
			}
		}

	}
}

ItemInfoEx.h
Código:
#define pGetItemAtt(id, offset)	(*(DWORD*)0x8128AC0 + 84 * id + offset) //1.04D || 1.04E may be -0x150
#define pSetItemOption			((void(__cdecl*)(ObjectItem * lpItem, BYTE Option, BYTE Special, BYTE Value)) 0x58B910) //1.04D || 1.04E may be -0x150

class cItemInfoEx
{
public:
	cItemInfoEx();
	~cItemInfoEx();
	void Load();
	// ----
}; extern cItemInfoEx gItemInfoEx;
Protec.h
Código:
CUSTOM_ITEM_INFO_EX m_CustomItemInfo_Ex[MAX_CUSTOM_ITEM_INFO];
Main.cpp
Código:
#include "CustomItemInfo.h"
#include "ItemInfoEx.h"


gCustomItemInfo.Load(gProtect.m_MainInfo.m_CustomItemInfo_Ex);
gItemInfoEx.Load();
GetMainInfo

CustomItemInfo.cpp
Código:
#include "stdafx.h"
#include "CustomItemInfo.h"
#include "MemScript.h"
#include "InfoLog.h"

CCustomItemInfo gCustomItemInfo;

CCustomItemInfo::CCustomItemInfo() // OK
{
	this->Init();
}

CCustomItemInfo::~CCustomItemInfo() // OK
{

}

void CCustomItemInfo::Init() // OK
{
	for(int n=0;n < MAX_CUSTOM_ITEM_INFO;n++)
	{
		this->m_CustomItemInfoEx[n].Index = -1;
	}
}

void CCustomItemInfo::Load(char* path)
{
	CMemScript* lpMemScript = new CMemScript;

	if(lpMemScript == 0)
	{
		printf(MEM_SCRIPT_ALLOC_ERROR,path);
		return;
	}

	if(lpMemScript->SetBuffer(path) == 0)
	{
		printf(lpMemScript->GetLastError());
		delete lpMemScript;
		return;
	}

	this->Init();

	try
	{
		while(true)
		{
			if(lpMemScript->GetToken() == TOKEN_END)
			{
				break;
			}

			if(strcmp("end",lpMemScript->GetString()) == 0)
			{
				break;
			}

			CUSTOM_ITEM_INFO_EX info;

			memset(&info,0,sizeof(info));

			static int CustomItemIndexCount = 0;

			info.Index = CustomItemIndexCount++;

			info.ItemType = lpMemScript->GetNumber();

			info.ItemIndex = lpMemScript->GetAsNumber();

			info.DamageMin = lpMemScript->GetAsNumber();

			info.DamageMax = lpMemScript->GetAsNumber();

			info.Defense = lpMemScript->GetAsNumber();

			info.MagicDefense = lpMemScript->GetAsNumber();

			gInfoLog.Output(LOG_KILLERS,"Agregando Item (%d, %d) AtaqueMin: %d AtaqueMax: %d Defense: %d MagicDefense: %d",info.ItemType,info.ItemIndex,info.DamageMin,info.DamageMax,info.Defense,info.MagicDefense);

			this->SetInfo(info);
		}
	}
	catch(...)
	{
		printf(lpMemScript->GetLastError());
	}

	delete lpMemScript;
}

void CCustomItemInfo::SetInfo(CUSTOM_ITEM_INFO_EX info) // OK
{
	if(info.Index < 0 || info.Index >= MAX_CUSTOM_ITEM_INFO)
	{
		return;
	}

	this->m_CustomItemInfoEx[info.Index] = info;
}
CustomItemInfo.h
Código:
struct CUSTOM_ITEM_INFO_EX
{
	int Index;
	int ItemType;
	int ItemIndex;
	int DamageMin;
	int DamageMax;
	int Defense;
	int MagicDefense;
};

class CCustomItemInfo
{
public:
	CCustomItemInfo();
	virtual ~CCustomItemInfo();
	void Init();
	void Load(char* path);
	void SetInfo(CUSTOM_ITEM_INFO_EX info);
public:
	CUSTOM_ITEM_INFO_EX m_CustomItemInfoEx[MAX_CUSTOM_ITEM_INFO];
};

extern CCustomItemInfo gCustomItemInfo;
GetMainInfo.cpp
Código:
CUSTOM_ITEM_INFO_EX m_CustomItemInfo_Ex[MAX_CUSTOM_ITEM_INFO];


gCustomItemInfo.Load("CustomItemInfoEx.txt");

memcpy(info.m_CustomItemInfo_Ex, gCustomItemInfo.m_CustomItemInfoEx, sizeof(info.m_CustomItemInfo_Ex));

CustomItemInfoEx.txt
Código PHP:
//ItemType    ItemIndex    DamageMin    DamageMax    Defense        MagicDefense
7            189            *            *            273            0
0            42            252            263            
*            *
end
end 
Créditos:
takumi12
bimaloha