protocol compability fixes
This commit is contained in:
		
							parent
							
								
									ffa94f10b6
								
							
						
					
					
						commit
						b7a70dd1e3
					
				|  | @ -81,6 +81,12 @@ namespace Proto { | ||||||
|         LoginServerCharacterList = 100 |         LoginServerCharacterList = 100 | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     enum CreatureOpcode { | ||||||
|  |         UnknownCreature = 97, | ||||||
|  |         OutdatedCreature = 98, | ||||||
|  |         Creature = 99 | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     enum GameServerOpcodes { |     enum GameServerOpcodes { | ||||||
|         GameServerInitGame                  = 10, |         GameServerInitGame                  = 10, | ||||||
|         GameServerGMActions                 = 11, |         GameServerGMActions                 = 11, | ||||||
|  |  | ||||||
|  | @ -162,7 +162,6 @@ private: | ||||||
|     void parseCreatureSkulls(InputMessage& msg); |     void parseCreatureSkulls(InputMessage& msg); | ||||||
|     void parseCreatureShields(InputMessage& msg); |     void parseCreatureShields(InputMessage& msg); | ||||||
|     void parseCreatureUnpass(InputMessage& msg); |     void parseCreatureUnpass(InputMessage& msg); | ||||||
|     void parseCreatureTurn(InputMessage& msg); |  | ||||||
|     void parseEditText(InputMessage& msg); |     void parseEditText(InputMessage& msg); | ||||||
|     void parseEditList(InputMessage& msg); |     void parseEditList(InputMessage& msg); | ||||||
|     void parsePlayerInfo(InputMessage& msg); |     void parsePlayerInfo(InputMessage& msg); | ||||||
|  | @ -209,6 +208,7 @@ private: | ||||||
|     void setTileDescription(InputMessage& msg, Position position); |     void setTileDescription(InputMessage& msg, Position position); | ||||||
| 
 | 
 | ||||||
|     Outfit internalGetOutfit(InputMessage& msg); |     Outfit internalGetOutfit(InputMessage& msg); | ||||||
|  |     CreaturePtr internalGetCreature(InputMessage& msg, int type = 0); | ||||||
|     ThingPtr internalGetThing(InputMessage& msg); |     ThingPtr internalGetThing(InputMessage& msg); | ||||||
|     ItemPtr internalGetItem(InputMessage& msg, int id = 0); |     ItemPtr internalGetItem(InputMessage& msg, int id = 0); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -455,11 +455,8 @@ void ProtocolGame::parseTileTransformThing(InputMessage& msg) | ||||||
|     Position pos = parsePosition(msg); |     Position pos = parsePosition(msg); | ||||||
|     int stackPos = msg.getU8(); |     int stackPos = msg.getU8(); | ||||||
| 
 | 
 | ||||||
|     int thingId = msg.getU16(); |     ThingPtr thing = internalGetThing(msg); | ||||||
|     if(thingId == 0x0061 || thingId == 0x0062 || thingId == 0x0063) { |     if(thing) { | ||||||
|         parseCreatureTurn(msg); |  | ||||||
|     } else { |  | ||||||
|         ThingPtr thing = internalGetItem(msg, thingId); |  | ||||||
|         if(!g_map.removeThingByPos(pos, stackPos)) |         if(!g_map.removeThingByPos(pos, stackPos)) | ||||||
|             logTraceError("could not remove thing"); |             logTraceError("could not remove thing"); | ||||||
|         g_map.addThing(thing, pos, stackPos); |         g_map.addThing(thing, pos, stackPos); | ||||||
|  | @ -502,11 +499,7 @@ void ProtocolGame::parseCreatureMove(InputMessage& msg) | ||||||
| void ProtocolGame::parseOpenContainer(InputMessage& msg) | void ProtocolGame::parseOpenContainer(InputMessage& msg) | ||||||
| { | { | ||||||
|     int containerId = msg.getU8(); |     int containerId = msg.getU8(); | ||||||
| #if PROTOCOL>=920 |  | ||||||
|     ItemPtr containerItem = internalGetItem(msg); |     ItemPtr containerItem = internalGetItem(msg); | ||||||
| #else |  | ||||||
|     ItemPtr containerItem = Item::create(msg.getU16()); |  | ||||||
| #endif |  | ||||||
|     std::string name = msg.getString(); |     std::string name = msg.getString(); | ||||||
|     int capacity = msg.getU8(); |     int capacity = msg.getU8(); | ||||||
|     bool hasParent = (msg.getU8() != 0); |     bool hasParent = (msg.getU8() != 0); | ||||||
|  | @ -796,18 +789,6 @@ void ProtocolGame::parseCreatureUnpass(InputMessage& msg) | ||||||
|         logTraceError("could not get creature"); |         logTraceError("could not get creature"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ProtocolGame::parseCreatureTurn(InputMessage& msg) |  | ||||||
| { |  | ||||||
|     uint id = msg.getU32(); |  | ||||||
|     Otc::Direction direction = (Otc::Direction)msg.getU8(); |  | ||||||
| 
 |  | ||||||
|     CreaturePtr creature = g_map.getCreatureById(id); |  | ||||||
|     if(creature) |  | ||||||
|         creature->turn(direction); |  | ||||||
|     else |  | ||||||
|         logTraceError("could not get creature"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ProtocolGame::parseEditText(InputMessage& msg) | void ProtocolGame::parseEditText(InputMessage& msg) | ||||||
| { | { | ||||||
|     uint id = msg.getU32(); |     uint id = msg.getU32(); | ||||||
|  | @ -998,6 +979,15 @@ void ProtocolGame::parseOpenChannel(InputMessage& msg) | ||||||
|     int channelId = msg.getU16(); |     int channelId = msg.getU16(); | ||||||
|     std::string name = msg.getString(); |     std::string name = msg.getString(); | ||||||
| 
 | 
 | ||||||
|  | #if PROTOCOL>=944 | ||||||
|  |     int joinedPlayers = msg.getU16(); | ||||||
|  |     for(int i=0;i<joinedPlayers;++i) | ||||||
|  |         msg.getString(); // player name
 | ||||||
|  |     int invitedPlayers = msg.getU16(); | ||||||
|  |     for(int i=0;i<invitedPlayers;++i) | ||||||
|  |         msg.getString(); // player name
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     g_game.processOpenChannel(channelId, name); |     g_game.processOpenChannel(channelId, name); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1285,8 +1275,7 @@ void ProtocolGame::setTileDescription(InputMessage& msg, Position position) | ||||||
|                 logTraceError("too many things, stackpos=", stackPos, " pos=", position); |                 logTraceError("too many things, stackpos=", stackPos, " pos=", position); | ||||||
| 
 | 
 | ||||||
|             ThingPtr thing = internalGetThing(msg); |             ThingPtr thing = internalGetThing(msg); | ||||||
|             if(thing) |             g_map.addThing(thing, position, -1); | ||||||
|                 g_map.addThing(thing, position, -1); |  | ||||||
|         } |         } | ||||||
|         stackPos++; |         stackPos++; | ||||||
|     } |     } | ||||||
|  | @ -1304,9 +1293,6 @@ Outfit ProtocolGame::internalGetOutfit(InputMessage& msg) | ||||||
|         int legs = msg.getU8(); |         int legs = msg.getU8(); | ||||||
|         int feet = msg.getU8(); |         int feet = msg.getU8(); | ||||||
|         int addons = msg.getU8(); |         int addons = msg.getU8(); | ||||||
| #if PROTOCOL>=870 |  | ||||||
|         msg.getU16(); // mount
 |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|         outfit.setId(lookType); |         outfit.setId(lookType); | ||||||
|         outfit.setHead(head); |         outfit.setHead(head); | ||||||
|  | @ -1327,6 +1313,10 @@ Outfit ProtocolGame::internalGetOutfit(InputMessage& msg) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if PROTOCOL>=870 | ||||||
|  |     msg.getU16(); // mount
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     return outfit; |     return outfit; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1334,23 +1324,36 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg) | ||||||
| { | { | ||||||
|     ThingPtr thing; |     ThingPtr thing; | ||||||
| 
 | 
 | ||||||
|     int thingId = msg.getU16(); |     int id = msg.getU16(); | ||||||
|     if(thingId == 0) |  | ||||||
|         Fw::throwException("thingId == 0"); |  | ||||||
| 
 | 
 | ||||||
|     if(thingId == 0x0061 || thingId == 0x0062) { // add new creature
 |     if(id == 0) | ||||||
|         CreaturePtr creature; |         Fw::throwException("invalid thing id"); | ||||||
|  |     else if(id == Proto::UnknownCreature || id == Proto::OutdatedCreature || id == Proto::Creature) | ||||||
|  |         thing = internalGetCreature(msg, id); | ||||||
|  |     else // item
 | ||||||
|  |         thing = internalGetItem(msg, id); | ||||||
| 
 | 
 | ||||||
|         if(thingId == 0x0062) { //creature is known
 |     return thing; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CreaturePtr ProtocolGame::internalGetCreature(InputMessage& msg, int type) | ||||||
|  | { | ||||||
|  |     if(type == 0) | ||||||
|  |         type = msg.getU16(); | ||||||
|  | 
 | ||||||
|  |     CreaturePtr creature; | ||||||
|  |     bool known = (type != Proto::UnknownCreature); | ||||||
|  | 
 | ||||||
|  |     if(type == Proto::OutdatedCreature || type == Proto::UnknownCreature) { | ||||||
|  |         if(known) { | ||||||
|             uint id = msg.getU32(); |             uint id = msg.getU32(); | ||||||
| 
 |             creature = g_map.getCreatureById(id); | ||||||
|             CreaturePtr knownCreature = g_map.getCreatureById(id); |             if(!creature) | ||||||
|             if(knownCreature) |  | ||||||
|                 creature = knownCreature; |  | ||||||
|             else |  | ||||||
|                 logTraceError("server said that a creature is known, but it's not"); |                 logTraceError("server said that a creature is known, but it's not"); | ||||||
|         } else if(thingId == 0x0061) { //creature is not known
 |         } else { | ||||||
|             uint removeId = msg.getU32(); |             uint removeId = msg.getU32(); | ||||||
|  |             g_map.removeCreatureById(removeId); | ||||||
|  | 
 | ||||||
|             uint id = msg.getU32(); |             uint id = msg.getU32(); | ||||||
| 
 | 
 | ||||||
|             int creatureType; |             int creatureType; | ||||||
|  | @ -1364,13 +1367,13 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg) | ||||||
|             else |             else | ||||||
|                 creatureType = Proto::CreatureTypeNpc; |                 creatureType = Proto::CreatureTypeNpc; | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|             std::string name = msg.getString(); |             std::string name = msg.getString(); | ||||||
| 
 | 
 | ||||||
|             if(name.length() > 0) // every creature name must start with a capital letter
 |             // every creature name must start with a capital letter
 | ||||||
|  |             if(name.length() > 0) | ||||||
|                 name[0] = toupper(name[0]); |                 name[0] = toupper(name[0]); | ||||||
| 
 | 
 | ||||||
|             g_map.removeCreatureById(removeId); |  | ||||||
| 
 |  | ||||||
|             if(id == m_localPlayer->getId()) |             if(id == m_localPlayer->getId()) | ||||||
|                 creature = m_localPlayer; |                 creature = m_localPlayer; | ||||||
|             else if(creatureType == Proto::CreatureTypePlayer) |             else if(creatureType == Proto::CreatureTypePlayer) | ||||||
|  | @ -1407,7 +1410,7 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg) | ||||||
|         bool passable = false; |         bool passable = false; | ||||||
| 
 | 
 | ||||||
| #if PROTOCOL>=854 | #if PROTOCOL>=854 | ||||||
|         if(thingId == 0x0061) |         if(!known) | ||||||
|             emblem = msg.getU8(); |             emblem = msg.getU8(); | ||||||
| 
 | 
 | ||||||
|         passable = (msg.getU8() == 0); |         passable = (msg.getU8() == 0); | ||||||
|  | @ -1428,15 +1431,23 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg) | ||||||
|             if(creature == m_localPlayer && !m_localPlayer->isKnown()) |             if(creature == m_localPlayer && !m_localPlayer->isKnown()) | ||||||
|                 m_localPlayer->setKnown(true); |                 m_localPlayer->setKnown(true); | ||||||
|         } |         } | ||||||
|  |     } else if(type == Proto::Creature) { | ||||||
|  |         uint id = msg.getU32(); | ||||||
|  |         Otc::Direction direction = (Otc::Direction)msg.getU8(); | ||||||
|  | #if PROTOCOL>=953 | ||||||
|  |         msg.getU8(); // passable
 | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|         thing = creature; |         creature = g_map.getCreatureById(id); | ||||||
|     } else if(thingId == 0x0063) { // creature turn
 |         if(creature) | ||||||
|         parseCreatureTurn(msg); |             creature->turn(direction); | ||||||
|     } else { // item
 |         else | ||||||
|         thing = internalGetItem(msg, thingId); |             logTraceError("invalid creature"); | ||||||
|  |     } else { | ||||||
|  |         Fw::throwException("invalid creature opcode"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return thing; |     return creature; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ItemPtr ProtocolGame::internalGetItem(InputMessage& msg, int id) | ItemPtr ProtocolGame::internalGetItem(InputMessage& msg, int id) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart