Index: src/map/baseentity.cpp =================================================================== --- src/map/baseentity.cpp (revision 3122) +++ src/map/baseentity.cpp (working copy) @@ -51,6 +51,18 @@ return name.c_str(); } +const int8* CBaseEntity::GetTellName() +{ + //Strip out the _ in names + npcTellName = name; + size_t start_pos = npcTellName.find("_"); + if (start_pos < name.size()) + { + npcTellName.replace(start_pos,1," "); + } + return npcTellName.c_str(); +} + uint8 CBaseEntity::getZone() { return loc.zone != NULL ? loc.zone->GetID() : loc.destination; Index: src/map/baseentity.h =================================================================== --- src/map/baseentity.h (revision 3122) +++ src/map/baseentity.h (working copy) @@ -115,6 +115,7 @@ STATUSTYPE status; // статус сущности (разные сущности - разные статусы) uint16 m_TargID; // targid объекта, на который смотрит сущность string_t name; // имя сущности + string_t npcTellName; // NPC Tell name look_t look; // внешний вид всех сущностей look_t mainlook; // only used if mob use changeSkin() location_t loc; // местоположение сущности @@ -124,6 +125,7 @@ uint8 speedsub; // подолнительный параметр скорости передвижения virtual const int8* GetName(); // имя сущности + virtual const int8* GetTellName(); // имя сущности uint8 getZone(); // текущая зона float GetXPos(); // позиция по координате X float GetYPos(); // позиция по координате Y Index: src/map/lua/luautils.cpp =================================================================== --- src/map/lua/luautils.cpp (revision 3122) +++ src/map/lua/luautils.cpp (working copy) @@ -56,6 +56,7 @@ #include "../packets/char_sync.h" #include "../packets/char_update.h" #include "../packets/char.h" +#include "../packets/chat_message.h" #include "../packets/menu_raisetractor.h" #include "../packets/message_basic.h" #include "../packets/uncnown_39.h" @@ -108,6 +109,7 @@ lua_register(LuaHandle,"UpdateNMSpawnPoint",luautils::UpdateNMSpawnPoint); lua_register(LuaHandle,"getCorsairRollEffect",luautils::getCorsairRollEffect); + lua_register(LuaHandle,"SendMobMessage",luautils::SendMobMessage); Lunar::Register(LuaHandle); Lunar::Register(LuaHandle); @@ -653,6 +655,31 @@ return 1; } +int32 SendMobMessage(lua_State* L) +{ + uint32 mobid = (uint32)lua_tointeger(L,1); + uint32 CharID = (uint32)lua_tointeger(L,2); + CBaseEntity* PNPC = (CBaseEntity*)zoneutils::GetEntity(mobid, TYPE_MOB | TYPE_NPC); + if (PNPC != NULL) + { + const int8* Query = "SELECT targid, pos_zone FROM chars INNER JOIN accounts_sessions USING(charid) WHERE charid = %u LIMIT 1"; + int32 ret = Sql_Query(SqlHandle, Query, CharID); + if (ret != SQL_ERROR && + Sql_NumRows(SqlHandle) != 0 && + Sql_NextRow(SqlHandle) == SQL_SUCCESS) + { + uint16 TargID = (uint16)Sql_GetUIntData(SqlHandle,0); + uint8 ZoneID = (uint8) Sql_GetUIntData(SqlHandle,1); + CCharEntity* PTellRecipient = (CCharEntity*)zoneutils::GetZone(ZoneID)->GetEntity(TargID, TYPE_PC); + int8* data = (int8*)lua_tolstring(L,3,NULL); + int8* name = (int8*)PNPC->GetTellName(); + uint8 size = (uint8)PNPC->name.size(); + PTellRecipient->pushPacket(new CNPCMessagePacket(name,ZoneID,data,size)); + } + } + return 1; +} + /************************************************************************ * * * Загружаем значение переменной TextID указанной зоны * Index: src/map/lua/luautils.h =================================================================== --- src/map/lua/luautils.h (revision 3122) +++ src/map/lua/luautils.h (working copy) @@ -136,6 +136,7 @@ int32 GetMobRespawnTime(lua_State* L); // get the respawn time of a mob int32 DeterMob(lua_State* L); // Allow or prevent a mob from spawning int32 UpdateNMSpawnPoint(lua_State* L); // Update the spawn point of an NM + int32 SendMobMessage(lua_State* L); }; #endif //- _LUAUTILS_H - Index: src/map/packets/chat_message.cpp =================================================================== --- src/map/packets/chat_message.cpp (revision 3122) +++ src/map/packets/chat_message.cpp (working copy) @@ -44,4 +44,14 @@ memcpy(data+(0x08)-4, PChar->GetName(), PChar->name.size()); memcpy(data+(0x18)-4, buff, strlen(buff)); +} + +CNPCMessagePacket::CNPCMessagePacket(int8* name, uint8 zone, int8* dat, uint8 size) +{ + this->type = 0x17; + this->size = 32 + strlen(dat) + strlen(dat)%2; + WBUFB(data,(0x04)-4) = 0x03; + WBUFB(data,(0x06)-4) = zone; + memcpy(data+(0x08)-4, name,size); + memcpy(data+(0x18)-4, dat, strlen(dat)); } \ No newline at end of file Index: src/map/packets/chat_message.h =================================================================== --- src/map/packets/chat_message.h (revision 3122) +++ src/map/packets/chat_message.h (working copy) @@ -57,4 +57,9 @@ CChatMessagePacket(CCharEntity* PChar, CHAT_MESSAGE_TYPE MessageType, int8* buff); }; +class CNPCMessagePacket : public CBasicPacket +{ +public: + CNPCMessagePacket(int8* name, uint8 zone, int8* dat,uint8 size); +}; #endif \ No newline at end of file