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

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

 	Scheduler::getInstance().addEvent(createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, boost::bind(&Game::checkExpiredMarketOffers, this)));
 }
+
+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
