  	Scheduler::getInstance().addEvent(createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, boost::bind(&Game::checkExpiredMarketOffers, this)));
  }
 +
-+void Game::parsePlayerExtendedOpcode(Player *player, uint8_t opcode, const std::string& buffer)
-+{
-+	if(player) {
-+		CreatureEventList extendedOpcodeEvents = player->getCreatureEvents(CREATURE_EVENT_EXTENDED_OPCODE);
-+		for(CreatureEventList::iterator it = extendedOpcodeEvents.begin(); it != extendedOpcodeEvents.end(); ++it)
-+			(*it)->executeExtendedOpcode(player, opcode, buffer);
-+	}
++void Game::parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer)
++{
++ Player* player = getPlayerByID(playerId);
++ if(!player || player->isRemoved())
++  return;
++
++	CreatureEventList extendedOpcodeEvents = player->getCreatureEvents(CREATURE_EVENT_EXTENDED_OPCODE);
++	for(CreatureEventList::iterator it = extendedOpcodeEvents.begin(); it != extendedOpcodeEvents.end(); ++it)
++		(*it)->executeExtendedOpcode(player, opcode, buffer);
 +}
 diff --git a/game.h b/game.h
 index 51fa397..7192549 100644

+	std::string buffer = msg.getString();
+
+	// process additional opcodes via lua script event
+	addGameTask(&Game::parsePlayerExtendedOpcode, player, opcode, buffer);
+}
+
+void ProtocolGame::sendExtendedOpcode(uint8_t opcode, const std::string& buffer)

 		std::map<Item*, int32_t> grounds;
 #endif
 
+		void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer);
+
 	protected:
 		bool playerWhisper(Player* player, const std::string& text, uint32_t statementId);
