Evolution Season 3 Episode 1
! Hello all !
! Here i will share information about this project !
! GameServer Version !
! 1.0.18.0 !
! Protocol !
! JPN , KOR !
>> Getting Started Basic <<
1. ConnectServer - v1.0.10.995
2. EDataServer - Pre-Coded
3. JoinServer - Pre-Coded
<< End of Basic >>
Hint:
1. Red - Old Update
2. Green - Last Update
3. Orange - Test
>>Update 1:<<
- Added SQL Connection
- Added Win XP,Vista,7,Server Support
- x64 bit OS Support
- Created ESQL.ini file for config
- Added GameServer Reload Options
- Added Error System Message
- Added Check File Exist
- Created information read from Folder EData
- GameServer files read re-maked
- Rebuild Information's in one DB
<< End Update 1 >>
>>Update 2:<<
- Added Question Event
- Added Question Configs
- Added Question Commands
- Added Question Reload Options
- Added Game Masters File
- Added Game Masters Privileges
- Added Game Masters Commands
- Added Kill Event
- Added Kill Event Configs
- Added Kill Event Reload Options
- Added Zen Event
- Added Zen Event Reload Options
- Added Zen Event Configs
- Added Timer to Events
- Fix Time End error
>> End Update 2 <<
>>Update 3:<<
- Added VIP Option
- Added VIP Update
- Added VIP Exp
- Added VIP Drop
- Read Info MEMB_INFO > VIP
- Added Login Information
- Added Messages
- Added ACC Info
- Added MaxOnline Info
>> End Update 3 <<
>>Update 4:<<
- Added Ecoins System
- Added Ecoins Options
-Added Ecoins DB Tables
- Added Reset System
- Added Custom Class Reset Options
- Added Reset Options
- Added DB Info Update
- Added Team vs Team Event
- Added Team vs Team Options
- Added Team vs Team Info
(Map 40)
(Random X Y)
(Random Time)
- Added New GM commands
- Added Jewels Pack System
- Added Monster Spawn Command
- Added OffTrade
- Added New Columns in ECommands.ini
- Added Messages display
<< End Update 4 >>
>>Update 5:<<
- Added /online
- Added /post
- Added /add
- Added /offzen
- Added /offcoin
- Added /skin
- Added /clearpk
- Added /status
- Added /reset
- Added /question
- Added /packlife
- Added /unpacklife
- Added /packchaos
- Added /unpackchaos
- Added /packcreation
- Added /unpackcreation
- Added /packharmony
- Added /unpackharmony
- Added /packguardian
- Added /unpackguardian
GM
- Added /mute (GM)
- Added /unmute (GM)
- Added /mob (GM)
- Added /gmove (GM)
- Added /setzen (GM)
- Added /pkclear (GM)
- Added /setpk (GM)
- Added /gg (GM)
- Added /trace (GM)
- Added /item (GM)
<< End Update 5 >>
>>Update 6:<<
- Added Guild System
- Added Guild Options
- Added EGuilds.ini Configs
- Added Golden Archer System
- Added Golden Archer Options
- Added Jewel Prices
- Added Jewel Rates
- Added Chaos Machine Mixes
- Added Chaos Machine Rates
- Added Anti-Dupe Lahap
- Added GS_CS in GS (2 in 1)
- Added Default Server Settings
(LevelUp,Skills,Options..etc..)
- Added Zen Drop Custom Configs
<< End Update 6 >>
>>Client Build 1.0<<
- Fixed Font
- New Interface
- Items Increased
- Glow
- Minimap
- Master Level Display
- Fix Master Level Enter Events
- LevelUp Message
- All Maps Corrected (no missing parts,no bugs)
- All Items,Options,SetType Corrected
- MoveReq corrected
- Gates corrected
- New Jewels Support
- CashShop Support
- New Wings Support
- Monster HP Bar (In progress)
- 3D Camera (In progress)
- Exp bar fixed
<< End Client Update >>
ScreenShots:
- Guild Systemhttp://i62.tinypic.com/16rlo2.jpg
- NPC Buff System
http://i62.tinypic.com/5uhduh.jpg
- Items Info
http://i59.tinypic.com/30tqg41.jpg
http://i59.tinypic.com/24vmp0k.jpg
- Client Infos Display
http://i60.tinypic.com/ortt2x.jpg
- CashShop Info
http://i62.tinypic.com/ju8h6x.jpg
- Chaos Mix Illusion Temple
http://i60.tinypic.com/9vftqa.jpg
Re: Evolution Season 3 Episode 1
yes it already has quest system
when will be released don't know for sure true date, still has more work to do its not so easy to build it for 1 day you know that ^^
Re: Evolution Season 3 Episode 1
someone has a /bau source to share?
Code:
void TrocaBau(short aIndex,char * Cod){
OBJECTSTRUCT *lpObj = (OBJECTSTRUCT*) OBJECT_POINTER(aIndex);
OBJECTSTRUCT * gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
int BauCod = atoi(Cod);
char QueryBau[200],mensagem[200];
int TotalBau = SQL.GetFieldInt("MuOnline.dbo.MEMB_INFO","BausExtra", "WHERE Memb___id = '%s'",lpObj->AccountID);
if (BauCod < 0 ){
GCServerMsgStringSend("Error Syntax : /bau <number>",aIndex,1);
return ;
}
else if(TotalBau < BauCod){
sprintf(mensagem,"[Error] : You have reached the limit %d baus!",TotalBau);
GCServerMsgStringSend(mensagem,aIndex,1);
return;
} else {
if( gObj->WarehouseSave == 0 )
{
sprintf(QueryBau,"EXEC MuOnline.dbo.MUDAR_BAU %d,%s",BauCod,lpObj->AccountID);
SQL.Execute(QueryBau);
sprintf(mensagem,"Chest changed successfully! You are using the chest %d",BauCod);
}
else
{
GCServerMsgStringSend("[Error] : Close warehouse to use this command!",aIndex,1);
}
}
}
Code:
CREATE TABLE [VaultsExtra] (
[login] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bauCod] [int] IDENTITY (1, 1) NOT NULL ,
[items] [varbinary] (1200) NULL ,
[money] [int] NULL ,
[pw] [smallint] NULL ,
[IdAcc] [int] NOT NULL
) ON [PRIMARY]
GO
Code:
ALTER TABLE dbo.warehouse ADD
[BauUso] [int] NOT NULL CONSTRAINT [DF_warehouse_BauUso] DEFAULT (0)
GO
Code:
ALTER TABLE dbo.MEMB_INFO ADD
BausExtra int NOT NULL DEFAULT
GO
Code:
CREATE PROCEDURE [dbo].[MUDAR_BAU] @bauCod INT @LogiN varchar(10)) AS
BEGIN
DECLARE @bauUSO1 int
set @bauUSO1 = (SELECT BauUso FROM warehouse WHERE AccountID = @LogiN)
IF ( EXISTS ( SELECT * FROM VaultsExtra WHERE [IdAcc] = @bauCod ) ) and @bauUSO1 != @bauCod)
BEGIN
DECLARE @itemback varbinary(1200)
DECLARE @Money int
set @Money = (SELECT [Money] FROM warehouse WHERE AccountID = @LogiN)
set @itemback = (SELECT Items FROM warehouse WHERE AccountID = @LogiN)
IF @bauCod > 0) AND @bauUSO1 = 0)
BEGIN
UPDATE VaultsExtra SET Items = @itemback,[Money] @Money WHERE login = @LogiN AND IdAcc = 0
END
UPDATE warehouse SET Items = (SELECT Items FROM VaultsExtra WHERE Login = @LogiN AND IDAcc = @bauCod),[Money] = (SELECT [Money] FROM VaultsExtra WHERE Login = @LogiN AND IDAcc = @bauCod),BauUso = @bauCod WHERE AccountID = @LogiN
UPDATE VaultsExtra SET Items = @itemback,[Money] @Money WHERE login = @LogiN AND IDAcc = @bauUSO1
END
END
GO
Code:
CREATE PROCEDURE [dbo].[CRIAR_BAU] @LogiN varchar(10)) AS
BEGIN
DECLARE @IDProce int
set @IDProce = (select count(items) FROM VaultsExtra Where login = @LogiN)
IF (EXISTS ( SELECT * FROM VaultsExtra WHERE [bauCod] = 0 ))
BEGIN
set @IDProce = 0
END
INSERT INTO VaultsExtra (login,items,[money],pw,IdAcc) VALUES @LogiN,0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,0,1,@IDProce)
UPDATE MEMB_INFO set BausExtra=BausExtra+1 Where memb___id = @LogiN
END
GO
Code:
if (!memcmp(&Protocol[13],CommandBau,strlen(CommandBau)))
{
TrocaBau(gObjId,(char*)Protocol+13+strlen(CommandBau));
//TrocaBau(short aIndex);
}
Re: Evolution Season 3 Episode 1
Code:
bool cChat::WareCommand(LPOBJ gObj, char *Msg)
{
if (CheckCommand(gObj, Configs.Commands.IsMultyVault, GmSystem.NONE, Configs.Commands.ZenForChange, Configs.Commands.PcPointForChange, Configs.Commands.WCoinForChange, Configs.Commands.WebPointsForChange, 0, 1, 0, "Ware", "/ware <num>", Msg))
return true;
if (gObj->WarehouseSave != 0 && gObj->m_IfState.use != 0 && gObj->m_IfState.state != 0 && gObj->m_bMapSvrMoveReq != false && gObj->m_bMapSvrMoveQuit != false && gObj->m_State != 1)
{
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] Stop all you actions and try again!");
return true;
}
int WantSlot = 0;
int UsedSlot = 0;
sscanf(Msg, "%d", &WantSlot);
if (MuOnlineQuery.ExecQuery("SELECT UsedSlot FROM warehouse WHERE AccountID = '%s'", gObj->AccountID) == TRUE)
{
short result = MuOnlineQuery.Fetch();
if (result != SQL_NO_DATA && result != SQL_NULL_DATA)
{
UsedSlot = MuOnlineQuery.GetAsInteger("UsedSlot");
}
}
MuOnlineQuery.Close();
if (UsedSlot <= 0)
{
MuOnlineQuery.ExecQuery("UPDATE warehouse SET Items01 = Items, UsedSlot = 1 WHERE AccountID = '%s'", gObj->AccountID);
MuOnlineQuery.Close();
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] something went wrong please try again!");
return true;
}
else
{
if (WantSlot < 1 || WantSlot > Configs.Commands.NumberOfVaults)
{
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] You can use from 1 to %d ware!", Configs.Commands.NumberOfVaults);
return true;
}
if (UsedSlot == WantSlot)
{
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] You need to chose other vault number!");
return true;
}
TakeCommand(gObj, Configs.Commands.ZenForChange, Configs.Commands.PcPointForChange, Configs.Commands.WCoinForChange, Configs.Commands.WebPointsForChange, "Ware");
if (MuOnlineQuery.ExecQuery("UPDATE warehouse SET Items%02d = Items, Items = Items%02d, UsedSlot = %d WHERE AccountID = '%s'", UsedSlot, WantSlot, WantSlot, gObj->AccountID) == TRUE)
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] You successfully change vault from %d to %d!", UsedSlot, WantSlot);
else
MessageLog(1, c_Red, t_COMMANDS, gObj, "[Ware] something went wrong please try again!", UsedSlot, WantSlot);
MuOnlineQuery.Close();
}
return true;
}
i edit IA Julia code to make it more secure and friendly BTW the code its not tested but should work good
*code updated*
Re: Evolution Season 3 Episode 1
Also don`t forget to make timeout between changing vaults (10 seconds)
Re: Evolution Season 3 Episode 1
Quote:
Originally Posted by
CyberLoveMD
Also don`t forget to make timeout between changing vaults (10 seconds)
the code above synced with GS so there no need of any stupid timer
Re: Evolution Season 3 Episode 1
Quote:
Originally Posted by
NanoGuy
the code above synced with GS so there no need of any stupid timer
I`ll test it when beta files are released..
Re: Evolution Season 3 Episode 1
with this code i need to rebuild everything to declare , not good option
maybe other information is welcomed
Re: Evolution Season 3 Episode 1
Quote:
Originally Posted by
Th3AnG3L
with this code i need to rebuild everything to declare , not good option
maybe other information is welcomed
mhm i updated the code anyway what declare are you talking about? the only "new" i see its CheckCommand and TakeCommand all other are regular
Re: Evolution Season 3 Episode 1
What???? Master level on season 3 episode 1 :o?
Re: Evolution Season 3 Episode 1
Re: Evolution Season 3 Episode 1
maybe you can send/post some testserver info ? so we can test them and help you find bugs or errors =).
Oh, and Good Luck with this, looks pretty nice so far.
Re: Evolution Season 3 Episode 1
maybe someone can help me here where i make mistake, cause i need sleep ^^
Exchange.cpp
Code:
#include "StdAfx.h"
#include "MSSQL.h"
pChatTargetSend ChatTargetSend = (pChatTargetSend) 0x0054E510; // OK
int OnlineStatus(int aIndex)
{
if(aIndex >= OBJECT_MIN && aIndex < OBJECT_MAX)
{
if(gObj[aIndex].Connected == 3)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
// Stone Exchanger
CExchanger Exchanger;
void CExchanger::Init()
{
this->m_Enabled = GetPrivateProfileInt("StoneExchanger","Enabled",1,"..\\EData\\ESQL.ini");
this->m_Count = GetPrivateProfileInt("StoneExchanger","StonesCount",3,"..\\EData\\ESQL.ini");
}
int CExchanger::CheckStones(int aIndex)
{
int Count = 0;
for(int i = 12; i < 76; i++)
{
if(gObj[aIndex].pInventory[i].m_Type == 0x1C15 && gObj[aIndex].pInventory[i].m_Level == 1)
{
Count++;
}
}
return Count;
}
void CExchanger::Talk(int aIndex,int Monster)
{
if(gObj[Monster].Class == 501) // Stone Exchanger
{
ChatTargetSend(&gObj[Monster],"I am collecting Stones, bring them to me if you find one.",aIndex);
if(this->m_Enabled == 0)
{
return;
}
if(OnlineStatus(aIndex) == 0)
{
return;
}
int Stones = CheckStones(aIndex);
if(Stones < this->m_Count)
{
char Need[50];
sprintf(Need,"You neeed more %d Stones to exchange.", this->m_Count - Stones);
ChatTargetSend(&gObj[Monster],Need,aIndex);
return;
}
int Count = 1;
for(int i = 12; i < 76; i++)
{
if(gObj[aIndex].pInventory[i].m_Type == 0x1C15 && gObj[aIndex].pInventory[i].m_Level == 1)
{
if(Count <= 3)
{
Count += 1;
gObjInventoryDeleteItem(aIndex, i);
GCInventoryItemDeleteSend(aIndex, i, 1);
}
}
}
GCLevelUpMsgSend(aIndex,1);
ChatTargetSend(&gObj[Monster], "Thank you for stones! Take my credit.", aIndex);
MySQL.Execute("UPDATE [MuOnline].[dbo].[MEMB_CREDITS] SET Credits = Credits + 1 WHERE memb___id = '%s'", gObj[aIndex].AccountID);
Log.AddTime("[StoneExchanger] (%s)(%s) Exchanged Stones, Map:[%d]", gObj[aIndex].AccountID, gObj[aIndex].Name, gObj[aIndex].MapNumber);
}
}
.h
Code:
#include "USER.h"
#include "StdAfx.h"
#ifndef __STONEEXCHANGER_H__
#define __STONEEXCHANGER_H__
typedef void (*pChatTargetSend) (OBJECTSTRUCT*,char*,int);
extern pChatTargetSend ChatTargetSend;
// Stone Exchanger
class CExchanger
{
public:
void Init();
int CheckStones(int aIndex);
void Talk(int aIndex,int Monster);
private:
int m_Enabled;
int m_Count;
};
extern CExchanger Exchanger;
#endif
Error:
Error 1 error LNK2001: unresolved external symbol "struct OBJECTSTRUCT * gObj" (?gObj@@3PAUOBJECTSTRUCT@@A)
Re: Evolution Season 3 Episode 1
Quote:
Originally Posted by
Th3AnG3L
maybe someone can help me here where i make mistake, cause i need sleep ^^
Exchange.cpp
Code:
#include "StdAfx.h"
#include "MSSQL.h"
pChatTargetSend ChatTargetSend = (pChatTargetSend) 0x0054E510; // OK
int OnlineStatus(int aIndex)
{
if(aIndex >= OBJECT_MIN && aIndex < OBJECT_MAX)
{
if(gObj[aIndex].Connected == 3)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
// Stone Exchanger
CExchanger Exchanger;
void CExchanger::Init()
{
this->m_Enabled = GetPrivateProfileInt("StoneExchanger","Enabled",1,"..\\EData\\ESQL.ini");
this->m_Count = GetPrivateProfileInt("StoneExchanger","StonesCount",3,"..\\EData\\ESQL.ini");
}
int CExchanger::CheckStones(int aIndex)
{
int Count = 0;
for(int i = 12; i < 76; i++)
{
if(gObj[aIndex].pInventory[i].m_Type == 0x1C15 && gObj[aIndex].pInventory[i].m_Level == 1)
{
Count++;
}
}
return Count;
}
void CExchanger::Talk(int aIndex,int Monster)
{
if(gObj[Monster].Class == 501) // Stone Exchanger
{
ChatTargetSend(&gObj[Monster],"I am collecting Stones, bring them to me if you find one.",aIndex);
if(this->m_Enabled == 0)
{
return;
}
if(OnlineStatus(aIndex) == 0)
{
return;
}
int Stones = CheckStones(aIndex);
if(Stones < this->m_Count)
{
char Need[50];
sprintf(Need,"You neeed more %d Stones to exchange.", this->m_Count - Stones);
ChatTargetSend(&gObj[Monster],Need,aIndex);
return;
}
int Count = 1;
for(int i = 12; i < 76; i++)
{
if(gObj[aIndex].pInventory[i].m_Type == 0x1C15 && gObj[aIndex].pInventory[i].m_Level == 1)
{
if(Count <= 3)
{
Count += 1;
gObjInventoryDeleteItem(aIndex, i);
GCInventoryItemDeleteSend(aIndex, i, 1);
}
}
}
GCLevelUpMsgSend(aIndex,1);
ChatTargetSend(&gObj[Monster], "Thank you for stones! Take my credit.", aIndex);
MySQL.Execute("UPDATE [MuOnline].[dbo].[MEMB_CREDITS] SET Credits = Credits + 1 WHERE memb___id = '%s'", gObj[aIndex].AccountID);
Log.AddTime("[StoneExchanger] (%s)(%s) Exchanged Stones, Map:[%d]", gObj[aIndex].AccountID, gObj[aIndex].Name, gObj[aIndex].MapNumber);
}
}
.h
Code:
#include "USER.h"
#include "StdAfx.h"
#ifndef __STONEEXCHANGER_H__
#define __STONEEXCHANGER_H__
typedef void (*pChatTargetSend) (OBJECTSTRUCT*,char*,int);
extern pChatTargetSend ChatTargetSend;
// Stone Exchanger
class CExchanger
{
public:
void Init();
int CheckStones(int aIndex);
void Talk(int aIndex,int Monster);
private:
int m_Enabled;
int m_Count;
};
extern CExchanger Exchanger;
#endif
Error:
Error 1 error LNK2001: unresolved external symbol "struct OBJECTSTRUCT * gObj" (?gObj@@3PAUOBJECTSTRUCT@@A)
extern?
Re: Evolution Season 3 Episode 1
Please try fix a agi bug in main(evil spirit, inferno etc.)