CustomNpcMove.txt + Requerimiento de item/entrada - Source Mu - Mu Server Files
 

CustomNpcMove.txt + Requerimiento de item/entrada

Publicado por Dakosmu, Oct 02, 2024, 06:06 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

Hola es el código del CustomNpcMove.txt solo agregue el requerimiento de items, de esta forma se puede usar como acceso a mapas, eventos, etc a los cuales se les puede pedir entrada.


CustomNpcMove.cpp
Code: [Select]
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CustomNpcMove.h"
#include "CastleSiegeSync.h"
#include "GensSystem.h"
#include "Map.h"
#include "MapManager.h"
#include "MemScript.h"
#include "Message.h"
#include "Notice.h"
#include "NpcTalk.h"
#include "Path.h"
#include "Util.h"

CCustomNpcMove gCustomNpcMove;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCustomNpcMove::CCustomNpcMove() // OK
{
this->m_CustomNpcMove.clear();
}

CCustomNpcMove::~CCustomNpcMove() // OK
{

}

void CCustomNpcMove::Load(char* path) // OK
{
CMemScript* lpMemScript = new CMemScript;

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

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

this->m_CustomNpcMove.clear();

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

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

NPC_MOVE_INFO info;

info.Index = lpMemScript->GetNumber();

info.MonsterClass = lpMemScript->GetAsNumber();

info.Map = lpMemScript->GetAsNumber();

info.X = lpMemScript->GetAsNumber();

info.Y = lpMemScript->GetAsNumber();

info.MoveMap = lpMemScript->GetAsNumber();

info.MoveX = lpMemScript->GetAsNumber();

info.MoveY = lpMemScript->GetAsNumber();

info.MinLevel = lpMemScript->GetAsNumber();

info.MaxLevel = lpMemScript->GetAsNumber();

info.MinReset = lpMemScript->GetAsNumber();

info.MaxReset = lpMemScript->GetAsNumber();

info.MinMReset = lpMemScript->GetAsNumber();

info.MaxMReset = lpMemScript->GetAsNumber();

info.AccountLevel = lpMemScript->GetAsNumber();

info.PkMove = lpMemScript->GetAsNumber();

// Req Item Igk

info.ReqItem = lpMemScript->GetAsNumber();

info.ReqItemLevel = lpMemScript->GetAsNumber();

info.ReqItemCount = lpMemScript->GetAsNumber();

strcpy_s(info.Question,lpMemScript->GetAsString());

this->m_CustomNpcMove.insert(std::pair(info.Index,info));
}
}
catch(...)
{
ErrorMessageBox(lpMemScript->GetLastError());
}

delete lpMemScript;
}

bool CCustomNpcMove::GetNpcMove(LPOBJ lpObj,int MonsterClass,int Map,int X,int Y) // OK
{
#if (GAMESERVER_CLIENTE_UPDATE >= 12)
for(std::map::iterator it=this->m_CustomNpcMove.begin();it != this->m_CustomNpcMove.end();it++)
{
if(it->second.MonsterClass == MonsterClass && it->second.Map == Map && it->second.X == X && it->second.Y == Y)
{

if(it->second.MinLevel != -1 && lpObj->Level < it->second.MinLevel)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(224),it->second.MinLevel);
return 1;
}

if(it->second.MaxLevel != -1 && lpObj->Level > it->second.MaxLevel)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(230),it->second.MaxLevel);
return 1;
}

if(it->second.MinReset != -1 && lpObj->Reset < it->second.MinReset)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(231),it->second.MinReset);
return 1;
}

if(it->second.MaxReset != -1 && lpObj->Reset > it->second.MaxReset)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(232),it->second.MaxReset);
return 1;
}

if(it->second.MinReset != -1 && lpObj->MasterReset < it->second.MinMReset)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(818),it->second.MinMReset);
return 1;
}

if(it->second.MaxReset != -1 && lpObj->MasterReset > it->second.MaxMReset)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(819),it->second.MaxMReset);
return 1;
}

if(lpObj->AccountLevel < it->second.AccountLevel)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(226));
return 1;
}

if(it->second.PkMove == 0 && lpObj->PKLevel >= 5)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(227));
return 1;
}

if(lpObj->Interface.use != 0 || lpObj->Teleport != 0 || lpObj->DieRegen != 0 || lpObj->PShopOpen != 0)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(226));
return 1;
}

if(it->second.MoveMap == MAP_ATLANS && (lpObj->Inventory[8].IsItem() != 0 && (lpObj->Inventory[8].m_Index == GET_ITEM(13,2) || lpObj->Inventory[8].m_Index == GET_ITEM(13,3)))) // Uniria,Dinorant
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(274));
return 1;
}

if((it->second.MoveMap == MAP_ICARUS || it->second.MoveMap == MAP_KANTURU3) && (lpObj->Inventory[7].IsItem() == 0 && lpObj->Inventory[8].m_Index != GET_ITEM(13,3) && lpObj->Inventory[8].m_Index != GET_ITEM(13,37))) // Dinorant,Fenrir
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(228));
return 1;
}

#if(GAMESERVER_UPDATE>=501)

if(lpObj->GensFamily == GENS_FAMILY_NONE && gMapManager.GetMapGensBattle(it->second.MoveMap) != 0)
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(229));
return 1;
}
#endif
// Requerimiento de Items
if(it->second.ReqItemCount > 0)
{
int count = gItemManager.GetInventoryItemCount(lpObj,it->second.ReqItem, it->second.ReqItemLevel);

if(count >= it->second.ReqItemCount)
{
gItemManager.DeleteInventoryItemCount(lpObj,it->second.ReqItem,it->second.ReqItemLevel,it->second.ReqItemCount);
gObjTeleport(lpObj->Index,it->second.MoveMap,it->second.MoveX,it->second.MoveY);
return 1;
}
else
{
gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(862),it->second.Question);
//gNotice.GCNoticeSend(lpObj->Index,1,0,0,0,0,0,gMessage.GetMessage(862));
return 1;
}
}

//-------


gObjTeleport(lpObj->Index,it->second.MoveMap,it->second.MoveX,it->second.MoveY);
return 1;
}

}
#endif
return 0;
}

CustomNpcMove.h
Code: [Select]
//////////////////////////////////////////////////////////////////////

#pragma once

#include "User.h"

struct NPC_MOVE_INFO
{
int Index;
int MonsterClass;
int Map;
int X;
int Y;
int MoveMap;
int MoveX;
int MoveY;
int MinLevel;
int MaxLevel;
int MinReset;
int MaxReset;
int MinMReset;
int MaxMReset;
int AccountLevel;
int PkMove;
// Req item Igk
int ReqItem;
int ReqItemLevel;
int ReqItemCount;
char Question[128];
};

class CCustomNpcMove
{
public:
CCustomNpcMove();
virtual ~CCustomNpcMove();
void Load(char* path);
bool GetNpcMove(LPOBJ lpObj,int MonsterClass,int Map,int X,int Y);
private:
std::map m_CustomNpcMove;
};

extern CCustomNpcMove gCustomNpcMove;



Deben agregar estas 4 columnas al archivo CustomNpcMove.txt y agregar una linea nueva al message.txt




862      "No puedes moverte: %s"

CustomNpcMove.txt

//Index   Npc NpcMap NpcX NpcY MoveMap MoveX MoveY MinLevel MaxLevel MinReset MaxReset MinMReset MaxMReset AccountLevel PKMove Index Level Count Comment
0         602 0 126 143 2 222 62 50 * * * * * 0 1 * 0 0 "Move To Devias Teste "
1         603 0 128 143 30 87 213 50 * * * * * 0 1 * 0 0 "Move To Devias Teste "
2     615 3 193 113 83 55 194 400 * * * * * 0 0 7342 0 1 "Necesitas 1 Spirit Map"
end

PD: no estoy seguro porque no lo he comprobado, pero con el npccustomquest se puede hacer lo mismo poniéndolo encima de cualquier npc.

Creeditos
Karuritoku
Bon Dia

llhenryxpxx

Recordar que :
la parte de CustomNpcMove.cpp

#if (GAMESERVER_CLIENTE_UPDATE >= 12) <- va depende de la versión que se tenga el GAMESERVER_CLIENTE_UPDATE
puede ser 12 , 14 o 17 la mas actual el seria el 17 , para los 3 funciona pero seria mejor tenerlo en la ultima versión.

🡱 🡳
Real Time Web Analytics