#include "stdafx.h"
#include "Handler_CW.h"
#include "User.h"
#include "WorldServer.h"
#include "UserManager.h"
//GM판정을 위해
#include "GMList.h"
#include <PacketStruct_CW.h>
#include <Protocol_CW.h>
// 채팅 메시지 전송을 위해
#include "ChannelManager.h"
#include "Channel.h"
#include "Zone.h"
#include "ViewPortManager.h"
// ArmorKit 프로토콜 릴레이 위해
#include "ServerSession.h"
#include "ServerSessionManager.h"
#include <PacketStruct_MW.h>
// 친구 관리 위해
#include <PacketStruct_DW.h>
#include <Protocol_DW.h>
// 길드 관리 위해
#include "WorldGuildManager.h"
#include "WorldGuild.h"
#include "WorldGuildMember.h"
#include <PacketStruct_WZ.h>
// GM 스트링 명령 파싱 위해
#include "GMCmdParser.h"
#include "GMCmdString.h"
#include "GMCmdManager.h"
GMCmdManager Handler_CW::m_GMCmdManager;
VOID Handler_CW::OnCW_HEARTBEAT( User *pUser, MSG_BASE *pMsg, WORD wSize )
{
// MessageOut( eCRITICAL_LOG, "[%s/%u] HeartBeat Recv", pUser->GetCharName().c_str(), pUser->GetGUID() );
}
VOID Handler_CW::OnCW_WHISPER_SYN( User *pUser, MSG_BASE *pMsg, WORD wSize )
{
MSG_CW_WHISPER_SYN *pRecvMsg = (MSG_CW_WHISPER_SYN*)pMsg;
char szTargetCharName[MAX_CHARNAME_LENGTH + 1];
ZeroMemory( szTargetCharName, sizeof(szTargetCharName) );
strncpy( szTargetCharName, pRecvMsg->szCharNameTo, MAX_CHARNAME_LENGTH );
// 귓말 사이즈가 너무 크면 접속을 끊는다.
if( pRecvMsg->byMsgLen > MAX_CHAT_LEN )
{
MessageOut(eCRITICAL_LOG, "귓말 사이즈(%d)가 너무 커서 불가.", pRecvMsg->byMsgLen );
// pUser->Disconnect();
return;
}
User *pTargetUser = UserManager::Instance()->FindUser( szTargetCharName );
// 귓말 대상이 없으면 실패 처리
if( !pTargetUser )
{
MessageOut(eCRITICAL_LOG, "귓말 대상을 찾을 수 없음 (%s) to (%s)", pUser->GetCharName().c_str(), szTargetCharName );
MSG_CW_WHISPER_NAK nakMsg;
nakMsg.byReason = MSG_CW_WHISPER_NAK::USER_NOT_FOUND;
pUser->Send( (BYTE*)&nakMsg, sizeof(MSG_CW_WHISPER_NAK) );
return;
}
// 대상이 나 자신인 경우 무시
if( pUser == pTargetUser )
{
MessageOut( eFULL_LOG, "자신에게 귓속말 (%s)", pUser->GetCharName().c_str() );
return;
}
// 대상이 귓말 수신을 차단했으면 실패
if( !pTargetUser->CanWhisper() )
{
// 대상 유저가 GM인지 검사한다
GM_INFO *pGMInfo;
pGMInfo = GMList::Instance()->FindGM((const char*)szTargetCharName);
//GM 유저 맞으면 귓말은 정상적으로 보내지만, 유저에게는 귓말 보내지 못한다고 알려준다
if(pGMInfo != NULL)
{
MessageOut(eCRITICAL_LOG, "귓말 차단된 GM 유저에게 귓말 (%s) to (%s)", pUser->GetCharName().c_str(), szTargetCharName );
// 귓말 차단된 것처럼 알려 준다
MSG_CW_WHISPER_NAK nakMsg;
nakMsg.byReason = MSG_CW_WHISPER_NAK::USER_WHISPER_OFF;
pUser->Send( (BYTE*)&nakMsg, sizeof(MSG_CW_WHISPER_NAK) );
if( pRecvMsg->byMsgLen >= MAX_CHAT_LEN )
{
MessageOut(eCRITICAL_LOG, "%s CW_CHAT_WHISPER_SYN 길이초과(%u)", pUser->GetCharName().c_str(), pRecvMsg->byMsgLen);
return;
}
// 대상에게 귓말 전송
MSG_CW_WHISPER_ACK resMsg;
_tcsncpy( resMsg.szCharNameFrom, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH - 1 );
resMsg.szCharNameFrom[MAX_CHARNAME_LENGTH-1] = '\0';
memset( resMsg.szWhisperMsg, 0, sizeof(char) * MAX_CHAT_LEN );
_tcsncpy( resMsg.szWhisperMsg, pRecvMsg->szWhisperMsg, pRecvMsg->byMsgLen );
resMsg.szWhisperMsg[pRecvMsg->byMsgLen] = '\0';
resMsg.byMsgLen = pRecvMsg->byMsgLen;
//pUser->Send( (BYTE*)&resMsg, resMsg.GetSize() );
pTargetUser->Send( (BYTE*)&resMsg, resMsg.GetSize() );
}
else
{
MessageOut(eCRITICAL_LOG, " 귓말 대상이 귓말 수신을 차단 (%s) to (%s)", pUser->GetCharName().c_str(), szTargetCharName );
MSG_CW_WHISPER_NAK nakMsg;
nakMsg.byReason = MSG_CW_WHISPER_NAK::USER_WHISPER_OFF;
pUser->Send( (BYTE*)&nakMsg, sizeof(MSG_CW_WHISPER_NAK) );
}
return;
}
// 대상에게 귓말 전송
MSG_CW_WHISPER_ACK resMsg;
_tcsncpy( resMsg.szCharNameFrom, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH - 1 );
resMsg.szCharNameFrom[MAX_CHARNAME_LENGTH-1] = '\0';
memset( resMsg.szWhisperMsg, 0, sizeof(char) * MAX_CHAT_LEN );
_tcsncpy( resMsg.szWhisperMsg, pRecvMsg->szWhisperMsg, pRecvMsg->byMsgLen );
resMsg.szWhisperMsg[pRecvMsg->byMsgLen] = '\0';
resMsg.byMsgLen = pRecvMsg->byMsgLen;
//pUser->Send( (BYTE*)&resMsg, resMsg.GetSize() );
pTargetUser->Send( (BYTE*)&resMsg, resMsg.GetSize() );
char szTemp[1024];
ZeroMemory( szTemp, sizeof(szTemp) );
strncpy( szTemp, pRecvMsg->szWhisperMsg, pRecvMsg->byMsgLen );
TCHAR ptszCharName[MAX_CHARNAME_LENGTH]={0,}, ptszTargetName[MAX_CHARNAME_LENGTH]={0,};
_tcsncpy( ptszCharName, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH - 1 );
_tcsncpy( ptszTargetName, pTargetUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH - 1 );
GAMELOG->WriteWhisperChat( NULL, ptszCharName, ptszTargetName, WorldServer::Instance()->GetServerKey(), resMsg.szWhisperMsg );
MessageOut( eFULL_LOG, "귓말 (%s) to (%s): %s", pUser->GetCharName().c_str(), szTargetCharName, szTemp );
}
VOID Handler_CW::OnCW_NOTICE_SYN( User *pUser, MSG_BASE *pMsg, WORD wSize )
{
MSG_CW_NOTICE_SYN *pRecvMsg = (MSG_CW_NOTICE_SYN*)pMsg;
// 길이가 최대값을 넘기면 접속을 끊는다.
/* if( pRecvMsg->byLen > MAX_NOTICE_LEN )
{
pUser->Disconnect();
return;
}
// TODO: 공지 권한이 없으면 리턴한다.
char szNotice[MAX_NOTICE_LEN + 1];
ZeroMemory( szNotice, sizeof(szNotice) );
strncpy( szNotice, pRecvMsg->szMsg, pRecvMsg->byLen );
WorldServer::Instance()->SendNoticeMsg( szNotice );*/
}
// 귓말 켜고 끔(차단) 처리
VOID Handler_CW::OnCW_WHISPER_SET_SYN( User *pUser, MSG_BASE *pMsg, WORD wSize )
{
MSG_CW_WHISPER_SET_SYN *pRecvMsg = (MSG_CW_WHISPER_SET_SYN*)pMsg;
if(!pUser)
{
MessageOut(eCRITICAL_LOG, "귓말 수신 여부 세팅 실패(pUser == NULL)");
return;
}
// 이 유저의 귓말 켬/끔 상태 세팅
pUser->SetWhisper(pRecvMsg->bWhisper);
// 성공했음을 알린다
MSG_CW_WHISPER_SET_ACK resMsg;
resMsg.bWhisper = pRecvMsg->bWhisper;
pUser->Send( (BYTE*)&resMsg, sizeof(MSG_CW_WHISPER_SET_ACK) );
MessageOut(eCRITICAL_LOG, "(%s) 귓말 세팅(%d)", pUser->GetCharName().c_str(), pRecvMsg->bWhisper);
}
// 채팅 요청
VOID Handler_CW::OnCW_CHAT_VILLAGE_SYN( User *pUser, MSG_BASE *pMsg, WORD wSize )
{
MSG_CW_CHAT_VILLAGE_SYN *pRecvMsg = (MSG_CW_CHAT_VILLAGE_SYN*)pMsg;
if(!pUser)
{
MessageOut(eCRITICAL_LOG, "CW_CHAT_VILLAGE_SYN 실패(pUser == NULL)");
return;
}
/*
// 보낸 유저 이름이 프로토콜 안에 설정된 값과 일치하는지 확인
string strCharName = pUser->GetCharName();
if(_strnicmp(strCharName.c_str(), pRecvMsg->m_szCharNameTo, MAX_CHARNAME_LENGTH))
{
//틀리면 오류!
MessageOut(eCRITICAL_LOG, "CW_CHAT_VILLAGE_SYN 실패(캐릭터 이름 불일치)");
return;
}
*/
// 너 어느 동네 소속이냐?
Channel *pChannel = ChannelManager::Instance()->GetChannel( pUser->GetChannelID() );
if(!pChannel)
{
// 소속된 채널 없어도 오류
MessageOut(eCRITICAL_LOG, "%s CW_CHAT_VILLAGE_SYN 실패(Channel %u)", pUser->GetCharName().c_str(), pUser->GetChannelID());
return;
}
Zone *pZone = pChannel->FindVillage(pUser->GetZoneKey());
if(!pZone)
{
// 소속된 마을 없어도 오류
MessageOut( eCRITICAL_LOG, "%s CW_CHAT_VILLAGE_SYN 실패[ZT:%u][ZK:%u]", pUser->GetCharName().c_str(),
pUser->GetStatus(),
pUser->GetZoneKey() );
return;
}
// 채팅 메시지 패킷 조립
MSG_CW_CHAT_VILLAGE_BRD resMsg;
resMsg.m_byCategory = CW_CHAT;
resMsg.m_byProtocol = CW_CHAT_VILLAGE_BRD;
memset(resMsg.m_szCharNameTo, 0, MAX_CHARNAME_LENGTH);
_tcsncpy(resMsg.m_szCharNameTo, pRecvMsg->m_szCharNameTo, MAX_CHARNAME_LENGTH - 1 ); // 같은 메시지이므로 그대로 복사
resMsg.m_szCharNameTo[MAX_CHARNAME_LENGTH-1] = '\0';
if(pRecvMsg->m_byMsgLength >= MSG_CW_CHAT_VILLAGE_SYN::_MAX_CHATMSG_SIZE)
{
MessageOut(eCRITICAL_LOG, "%s CW_CHAT_VILLAGE_SYN 길이초과(%u)", pUser->GetC
没有合适的资源?快使用搜索试试~ 我知道了~
奇迹世界游戏部分源代码
共638个文件
cpp:310个
h:301个
txt:9个
3星 · 超过75%的资源 需积分: 50 60 下载量 55 浏览量
2008-12-14
09:27:08
上传
评论
收藏 640KB RAR 举报
温馨提示
奇迹世界源码奇迹世界源码奇迹世界源码奇迹世界源码奇迹世界源码
资源推荐
资源详情
资源评论
收起资源包目录
奇迹世界游戏部分源代码 (638个子文件)
Handler_CW.cpp 57KB
Field.cpp 47KB
ItemManager.cpp 36KB
GMCmdManager.cpp 35KB
Channel.cpp 35KB
NPC.cpp 33KB
Player_Parameter.cpp 30KB
Sector.cpp 28KB
ItemManager_Composite.cpp 27KB
Handler_CG_GM.cpp 24KB
ActionTriggers.cpp 24KB
GameLog.cpp 23KB
SkillManager.cpp 23KB
GameServer.cpp 23KB
Character.cpp 23KB
CharacterFormula.cpp 21KB
Handler_CG_ITEM.cpp 21KB
PacketHandler.cpp 20KB
Player.cpp 19KB
ViewPortManager.cpp 18KB
Handler_CG_SYNC.cpp 18KB
MasterServer.cpp 18KB
Handler_AW.cpp 18KB
PacketHandler.cpp 16KB
WorldServer.cpp 16KB
ConditionTriggers.cpp 15KB
GMCmdManager.cpp 15KB
PacketHandler.cpp 13KB
Handler_DW.cpp 13KB
Handler_DG_CHARINFO.cpp 13KB
Handler_CG_TRADE.cpp 13KB
Skill.cpp 13KB
FieldInfo.cpp 13KB
TradeManager.cpp 12KB
FieldInfo.cpp 12KB
Handler_AG_ZONE.cpp 12KB
StatusFactory.cpp 12KB
StatusManager.cpp 11KB
Player_Skill.cpp 11KB
PVPManager.cpp 11KB
EquipmentSlotContainer.cpp 11KB
Trigger.cpp 11KB
StyleSkill.cpp 10KB
RegenManager.cpp 10KB
Handler_CG_TRIGGER.cpp 10KB
State.cpp 10KB
Handler_MW.cpp 10KB
Handler_CG_VENDOR.cpp 10KB
UserManager.cpp 10KB
User.cpp 10KB
Handler_WZ.cpp 10KB
VendorManager.cpp 10KB
AttackState.cpp 9KB
Player_Party.cpp 9KB
BattleRecord.cpp 9KB
ServerSessionManager.cpp 9KB
DropManager.cpp 8KB
TriggerInfo.cpp 8KB
InstantSkillAttack.cpp 8KB
GameGuildManager.cpp 8KB
TriggerManager.cpp 8KB
Handler_CG_PARTY.cpp 8KB
ChannelManager.cpp 8KB
PlayerStyle.cpp 7KB
Monster.cpp 7KB
Handler_CG_BATTLE.cpp 7KB
Handler_MO.cpp 7KB
main.cpp 7KB
ObjectFactory.cpp 7KB
GameZoneManager.cpp 6KB
Handler_GZ_GUILD.cpp 6KB
Party.cpp 6KB
SummonIdle.cpp 6KB
Summoned.cpp 6KB
Handler_CG_GUILD.cpp 6KB
WanderState.cpp 6KB
PatrolState.cpp 6KB
QuickManager.cpp 6KB
Ability.cpp 6KB
SummonManager.cpp 5KB
TrackState.cpp 5KB
Handler_CG_SUMMON.cpp 5KB
CharInfoList.cpp 5KB
NPC_Skill.cpp 5KB
ItemInfoList.cpp 5KB
ServerInfoManager.cpp 5KB
Execute_Summon.cpp 5KB
Player_Attack.cpp 5KB
WorldLog.cpp 5KB
QuickStyleManager.cpp 5KB
EventInventorySlotContainer.cpp 5KB
Handler_CG_STATUS.cpp 5KB
MonsterInfoList.cpp 5KB
Handler_MW.cpp 5KB
Handler_AG_PARTY.cpp 5KB
AbilityStatus.cpp 5KB
Handler_CG_Skill.cpp 5KB
WorldServerInfoParser.cpp 5KB
WorldGuildManager.cpp 4KB
GMCmdString.cpp 4KB
共 638 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
gaosiyu0607
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页