public static bool insert(Thing ptr)
{
//assert(!dbgLockObjects);
MapComposite map=ptr.getMap();
//assert(map && map.isActive());
/* Non-visible objects have neither position nor public ID, so their
insertion cannot fail. Take care of them first. */
if(!ptr.isVisible())
{
map.insert(ptr);
ptr.inserted();
return true;
}
// Check that coordinates are actually valid.
Actor obj=(Actor)ptr;
Map mp=map.getMap();
Point pos=obj.getPosition();
if((int)pos.x/mp.getTileWidth()>=mp.getWidth()||
(int)pos.y/mp.getTileHeight()>=mp.getHeight())
{
Logger.Write(LogLevel.Error, "Tried to insert an actor at position {0}, {1} outside map {2}.", pos.x, pos.y, map.getID());
// Set an arbitrary small position.
pos=new Point(100, 100);
obj.setPosition(pos);
}
if(!map.insert(obj))
{
// The map is overloaded, no room to add a new actor
Logger.Write(LogLevel.Error, "Too many actors on map {0}.", map.getID());
return false;
}
obj.inserted();
// DEBUG INFO //TODO Implementieren
// switch(obj.getType())
// {
// case ThingType.OBJECT_ITEM:
// Logger.Write(LogLevel.Debug, "Item inserted: "
// (Item)(obj).getItemClass().getDatabaseID());
// break;
//
// case ThingType.OBJECT_NPC:
// Logger.Write(LogLevel.Debug, "NPC inserted: "<<static_cast<NPC*>(obj).getNPC());
// break;
//
// case ThingType.OBJECT_CHARACTER:
// Logger.Write(LogLevel.Debug, "Player inserted: "
// <<static_cast<Being*>(obj).getName());
// break;
//
// case ThingType.OBJECT_EFFECT:
// Logger.Write(LogLevel.Debug, "Effect inserted: "
// <<static_cast<Effect*>(obj).getEffectId());
// break;
//
// case ThingType.OBJECT_MONSTER:
// Logger.Write(LogLevel.Debug, "Monster inserted: "
// <<static_cast<Monster*>(obj).getSpecy().getId());
// break;
//
// case ThingType.OBJECT_ACTOR:
// case ThingType.OBJECT_OTHER:
// default:
// Logger.Write(LogLevel.Debug, "Thing inserted: "<<obj.getType());
// }
obj.raiseUpdateFlags((byte)UpdateFlag.UPDATEFLAG_NEW_ON_MAP);
if(obj.getType()!=ThingType.OBJECT_CHARACTER)
return true;
/* Since the player does not know yet where in the world its character is,
we send a map-change message, even if it is the first time it
connects to this server. */
MessageOut mapChangeMessage=new MessageOut(Protocol.GPMSG_PLAYER_MAP_CHANGE);
mapChangeMessage.writeString(map.getName());
mapChangeMessage.writeInt16(pos.x);
mapChangeMessage.writeInt16(pos.y);
Program.gameHandler.sendTo((Character)(obj), mapChangeMessage);
// update the online state of the character
Program.accountHandler.updateOnlineStatus(((Character)obj).getDatabaseID(), true);
return true;
}