Implement creature marks

This commit is contained in:
Eduardo Bart 2013-11-11 01:45:18 -02:00
parent 9a30050340
commit 1868b235cb
3 changed files with 37 additions and 6 deletions

View File

@ -102,6 +102,7 @@ namespace Proto {
GameServerCreatureSkull = 144, GameServerCreatureSkull = 144,
GameServerCreatureParty = 145, GameServerCreatureParty = 145,
GameServerCreatureUnpass = 146, GameServerCreatureUnpass = 146,
GameServerCreatureMarks = 147,
GameServerPlayerHelpers = 148, GameServerPlayerHelpers = 148,
GameServerEditText = 150, GameServerEditText = 150,
GameServerEditList = 151, GameServerEditList = 151,

View File

@ -215,6 +215,7 @@ private:
void parseShowModalDialog(const InputMessagePtr& msg); void parseShowModalDialog(const InputMessagePtr& msg);
void parseExtendedOpcode(const InputMessagePtr& msg); void parseExtendedOpcode(const InputMessagePtr& msg);
void parseChangeMapAwareRange(const InputMessagePtr& msg); void parseChangeMapAwareRange(const InputMessagePtr& msg);
void parseCreaturesMark(const InputMessagePtr& msg);
public: public:
void setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height); void setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height);

View File

@ -329,6 +329,10 @@ void ProtocolGame::parseMessage(const InputMessagePtr& msg)
case Proto::GameServerPlayerHelpers: case Proto::GameServerPlayerHelpers:
parsePlayerHelpers(msg); parsePlayerHelpers(msg);
break; break;
// PROTOCOL>=1000
case Proto::GameServerCreatureMarks:
parseCreaturesMark(msg);
break;
// otclient ONLY // otclient ONLY
case Proto::GameServerExtendedOpcode: case Proto::GameServerExtendedOpcode:
parseExtendedOpcode(msg); parseExtendedOpcode(msg);
@ -336,11 +340,6 @@ void ProtocolGame::parseMessage(const InputMessagePtr& msg)
case Proto::GameServerChangeMapAwareRange: case Proto::GameServerChangeMapAwareRange:
parseChangeMapAwareRange(msg); parseChangeMapAwareRange(msg);
break; break;
// unknown
case 147: // proto >= 1000 ?
for(int i=0;i<19;++i)
msg->getU8();
break;
default: default:
stdext::throw_exception(stdext::format("unhandled opcode %d", (int)opcode)); stdext::throw_exception(stdext::format("unhandled opcode %d", (int)opcode));
break; break;
@ -1674,6 +1673,28 @@ void ProtocolGame::parseChangeMapAwareRange(const InputMessagePtr& msg)
g_lua.callGlobalField("g_game", "onMapChangeAwareRange", xrange, yrange); g_lua.callGlobalField("g_game", "onMapChangeAwareRange", xrange, yrange);
} }
void ProtocolGame::parseCreaturesMark(const InputMessagePtr& msg)
{
int len = msg->getU8();
for(int i=0; i<len; ++i) {
uint32 id = msg->getU32();
bool isPermanent = msg->getU8() != 1;
uint8 markType = msg->getU8();
CreaturePtr creature = g_map.getCreatureById(id);
if(creature) {
if(isPermanent) {
if(markType == 0xff)
creature->hideStaticSquare();
else
creature->showStaticSquare(Color::from8bit(markType));
} else
creature->addTimedSquare(markType);
} else
g_logger.traceError("could not get creature");
}
}
void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height) void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height)
{ {
int startz, endz, zstep; int startz, endz, zstep;
@ -1906,14 +1927,22 @@ CreaturePtr ProtocolGame::getCreature(const InputMessagePtr& msg, int type)
// emblem is sent only when the creature is not known // emblem is sent only when the creature is not known
int emblem = -1; int emblem = -1;
bool unpass = true; bool unpass = true;
uint8 mark;
if(g_game.getFeature(Otc::GameCreatureEmblems) && !known) if(g_game.getFeature(Otc::GameCreatureEmblems) && !known)
emblem = msg->getU8(); emblem = msg->getU8();
if(g_game.getFeature(Otc::GameThingMarks)) { if(g_game.getFeature(Otc::GameThingMarks)) {
msg->getU8(); // creature type for summons msg->getU8(); // creature type for summons
msg->getU8(); // mark uint8 mark = msg->getU8(); // mark
msg->getU16(); // helpers msg->getU16(); // helpers
if(creature) {
if(mark == 0xff)
creature->hideStaticSquare();
else
creature->showStaticSquare(Color::from8bit(mark));
}
} }
if(g_game.getProtocolVersion() >= 854) if(g_game.getProtocolVersion() >= 854)