public DelayedEvent(ushort itype, ushort ix, ushort iy, MapComposite im) { type=itype; x=ix; y=iy; map=im; }
/** * Creates a rectangular trigger for a given map. */ public TriggerArea(MapComposite m, Rectangle r, TriggerAction ptr, bool once) : base(ThingType.OBJECT_OTHER, m) { mZone=r; mAction=ptr; mOnce=once; }
// // friend struct SpawnAreaEventDispatch; public SpawnArea(MapComposite map, MonsterClass specy, Rectangle zone, int maxBeings, int spawnRate) : base(ThingType.OBJECT_OTHER, map) { mSpecy=specy; //mSpawnedListener=spawnAreaEventDispatch; //TODO Implementieren mZone=zone; mMaxBeings=maxBeings; mSpawnRate=spawnRate; }
static void warp(Character ptr, MapComposite map, int x, int y) { //TODO DEBUG555 entfernen int debug=555; remove(ptr); ptr.setMap(map); ptr.setPosition(new Point(x, y)); ptr.clearDestination(); /* Force update of persistent data on map change, so that characters can respawn at the start of the map after a death or a disconnection. */ Program.accountHandler.sendCharacterData(ptr); if(map.isActive()) { if(!insert(ptr)) { ptr.disconnected(); Program.gameHandler.kill(ptr); } } else { MessageOut msg=new MessageOut(Protocol.GAMSG_REDIRECT); msg.writeInt32(ptr.getDatabaseID()); Program.accountHandler.send(msg); Program.gameHandler.prepareServerChange(ptr); } }
public static void enqueueWarp(Character ptr, MapComposite m, int x, int y) { //TODO Implementieren // DelayedEvent e=new DelayedEvent(Event.EVENT_WARP, x, y, m); // enqueueEvent(ptr, e); }
/** * Updates object states on the map. */ static void updateMap(MapComposite map) { // 1. update object status. List< Thing > things = map.getEverything(); //TODO das könnte man auch weiter unten benutzen? foreach(Thing thing in things) { thing.update(); } // 2. run scripts. Script s = map.getScript(); if(s != null) { s.update(); } // 3. perform actions. if(map.mContent!=null) { foreach(Thing thing in map.mContent.things) { if(thing is Being) { Being being = (Being)thing; being.perform(); } } } //Alter Code // for (BeingIterator i(map.getWholeMapIterator()); i; ++i) // { // (*i).perform(); // } // 4. move objects around and update zones. foreach(Thing thing in map.mContent.things) { if(thing is Being) { Being being = (Being)thing; being.move(); } } // Alter Code //for (BeingIterator i(map.getWholeMapIterator()); i; ++i) //{ // (*i).move(); //} map.update(); }
/** * Prepares a call to the given function. * Only one function can be prepared at once. */ //virtual void prepare(const std::string &name) = 0; /** * Sets associated map. */ public void setMap(MapComposite m) { mMap=m; }
/** * Informs a player of what happened around the character. */ static void informPlayer(MapComposite map, Character p, int worldTime) { //MessageOut moveMsg(GPMSG_BEINGS_MOVE); //MessageOut damageMsg(GPMSG_BEINGS_DAMAGE); //const Point &pold = p.getOldPosition(), ppos = p.getPosition(); //int pid = p.getPublicID(), pflags = p.getUpdateFlags(); //int visualRange = Configuration::getValue("game_visualRange", 448); //// Inform client about activities of other beings near its character //for (BeingIterator i(map.getAroundBeingIterator(p, visualRange)); i; ++i) //{ // Being *o = *i; // const Point &oold = o.getOldPosition(), opos = o.getPosition(); // int otype = o.getType(); // int oid = o.getPublicID(), oflags = o.getUpdateFlags(); // int flags = 0; // // Check if the character p and the moving object o are around. // bool wereInRange = pold.inRangeOf(oold, visualRange) && // !((pflags | oflags) & UPDATEFLAG_NEW_ON_MAP); // bool willBeInRange = ppos.inRangeOf(opos, visualRange); // if (!wereInRange && !willBeInRange) // { // // Nothing to report: o and p are far away from each other. // continue; // } // if (wereInRange && willBeInRange) // { // // Send attack messages. // if ((oflags & UPDATEFLAG_ATTACK) && oid != pid) // { // MessageOut AttackMsg(GPMSG_BEING_ATTACK); // AttackMsg.writeInt16(oid); // AttackMsg.writeInt8(o.getDirection()); // AttackMsg.writeInt8(static_cast< Being * >(o).getAttackId()); // gameHandler.sendTo(p, AttackMsg); // } // // Send action change messages. // if ((oflags & UPDATEFLAG_ACTIONCHANGE)) // { // MessageOut ActionMsg(GPMSG_BEING_ACTION_CHANGE); // ActionMsg.writeInt16(oid); // ActionMsg.writeInt8(static_cast< Being * >(o).getAction()); // gameHandler.sendTo(p, ActionMsg); // } // // Send looks change messages. // if (oflags & UPDATEFLAG_LOOKSCHANGE) // { // MessageOut LooksMsg(GPMSG_BEING_LOOKS_CHANGE); // LooksMsg.writeInt16(oid); // Character * c = static_cast<Character * >(o); // serializeLooks(c, LooksMsg, false); // LooksMsg.writeInt16(c.getHairStyle()); // LooksMsg.writeInt16(c.getHairColor()); // LooksMsg.writeInt16(c.getGender()); // gameHandler.sendTo(p, LooksMsg); // } // // Send direction change messages. // if (oflags & UPDATEFLAG_DIRCHANGE) // { // MessageOut DirMsg(GPMSG_BEING_DIR_CHANGE); // DirMsg.writeInt16(oid); // DirMsg.writeInt8(o.getDirection()); // gameHandler.sendTo(p, DirMsg); // } // // Send damage messages. // if (o.canFight()) // { // Being *victim = static_cast< Being * >(o); // const Hits &hits = victim.getHitsTaken(); // for (Hits::const_iterator j = hits.begin(), // j_end = hits.end(); j != j_end; ++j) // { // damageMsg.writeInt16(oid); // damageMsg.writeInt16(*j); // } // } // if (oold == opos) // { // // o does not move, nothing more to report. // continue; // } // } // if (!willBeInRange) // { // // o is no longer visible from p. Send leave message. // MessageOut leaveMsg(GPMSG_BEING_LEAVE); // leaveMsg.writeInt16(oid); // gameHandler.sendTo(p, leaveMsg); // continue; // } // if (!wereInRange) // { // // o is now visible by p. Send enter message. // MessageOut enterMsg(GPMSG_BEING_ENTER); // enterMsg.writeInt8(otype); // enterMsg.writeInt16(oid); // enterMsg.writeInt8(static_cast< Being *>(o).getAction()); // enterMsg.writeInt16(opos.x); // enterMsg.writeInt16(opos.y); // enterMsg.writeInt8(o.getDirection()); // switch (otype) // { // case OBJECT_CHARACTER: // { // Character *q = static_cast< Character * >(o); // enterMsg.writeString(q.getName()); // enterMsg.writeInt8(q.getHairStyle()); // enterMsg.writeInt8(q.getHairColor()); // enterMsg.writeInt8(q.getGender()); // serializeLooks(q, enterMsg, true); // } break; // case OBJECT_MONSTER: // { // Monster *q = static_cast< Monster * >(o); // enterMsg.writeInt16(q.getSpecy().getId()); // enterMsg.writeString(q.getName()); // } break; // case OBJECT_NPC: // { // NPC *q = static_cast< NPC * >(o); // enterMsg.writeInt16(q.getNPC()); // enterMsg.writeString(q.getName()); // } break; // default: // assert(false); // TODO // } // gameHandler.sendTo(p, enterMsg); // } // if (opos != oold) // { // // Add position check coords every 5 seconds. // if (worldTime % 50 == 0) // flags |= MOVING_POSITION; // flags |= MOVING_DESTINATION; // } // // Send move messages. // moveMsg.writeInt16(oid); // moveMsg.writeInt8(flags); // if (flags & MOVING_POSITION) // { // moveMsg.writeInt16(oold.x); // moveMsg.writeInt16(oold.y); // } // if (flags & MOVING_DESTINATION) // { // moveMsg.writeInt16(opos.x); // moveMsg.writeInt16(opos.y); // // We multiply the sent speed (in tiles per second) by ten // // to get it within a byte with decimal precision. // // For instance, a value of 4.5 will be sent as 45. // moveMsg.writeInt8((unsigned short) // (o.getModifiedAttribute(ATTR_MOVE_SPEED_TPS) * 10)); // } //} //// Do not send a packet if nothing happened in p's range. //if (moveMsg.getLength() > 2) // gameHandler.sendTo(p, moveMsg); //if (damageMsg.getLength() > 2) // gameHandler.sendTo(p, damageMsg); //// Inform client about status change. //p.sendStatus(); //// Inform client about health change of party members //for (CharacterIterator i(map.getWholeMapIterator()); i; ++i) //{ // Character *c = *i; // // Make sure its not the same character // if (c == p) // continue; // // make sure they are in the same party // if (c.getParty() == p.getParty()) // { // int cflags = c.getUpdateFlags(); // if (cflags & UPDATEFLAG_HEALTHCHANGE) // { // MessageOut healthMsg(GPMSG_BEING_HEALTH_CHANGE); // healthMsg.writeInt16(c.getPublicID()); // healthMsg.writeInt16(c.getModifiedAttribute(ATTR_HP)); // healthMsg.writeInt16(c.getModifiedAttribute(ATTR_MAX_HP)); // gameHandler.sendTo(p, healthMsg); // } // } //} //// Inform client about items on the ground around its character //MessageOut itemMsg(GPMSG_ITEMS); //for (FixedActorIterator i(map.getAroundBeingIterator(p, visualRange)); i; // ++i) //{ // assert((*i).getType() == OBJECT_ITEM || // (*i).getType() == OBJECT_EFFECT); // Actor *o = *i; // Point opos = o.getPosition(); // int oflags = o.getUpdateFlags(); // bool willBeInRange = ppos.inRangeOf(opos, visualRange); // bool wereInRange = pold.inRangeOf(opos, visualRange) && // !((pflags | oflags) & UPDATEFLAG_NEW_ON_MAP); // if (willBeInRange ^ wereInRange) // { // switch (o.getType()) // { // case OBJECT_ITEM: // { // Item *o = static_cast< Item * >(*i); // if (oflags & UPDATEFLAG_NEW_ON_MAP) // { // /* Send a specific message to the client when an item appears // out of nowhere, so that a sound/animation can be performed. */ // MessageOut appearMsg(GPMSG_ITEM_APPEAR); // appearMsg.writeInt16(o.getItemClass().getDatabaseID()); // appearMsg.writeInt16(opos.x); // appearMsg.writeInt16(opos.y); // gameHandler.sendTo(p, appearMsg); // } // else // { // itemMsg.writeInt16(willBeInRange ? o.getItemClass().getDatabaseID() : 0); // itemMsg.writeInt16(opos.x); // itemMsg.writeInt16(opos.y); // } // } // break; // case OBJECT_EFFECT: // { // Effect *o = static_cast< Effect * >(*i); // o.show(); // // Don't show old effects // if (!(oflags & UPDATEFLAG_NEW_ON_MAP)) // break; // Being *b = o.getBeing(); // if (b) // { // MessageOut effectMsg(GPMSG_CREATE_EFFECT_BEING); // effectMsg.writeInt16(o.getEffectId()); // effectMsg.writeInt16(b.getPublicID()); // gameHandler.sendTo(p, effectMsg); // } else { // MessageOut effectMsg(GPMSG_CREATE_EFFECT_POS); // effectMsg.writeInt16(o.getEffectId()); // effectMsg.writeInt16(opos.x); // effectMsg.writeInt16(opos.y); // gameHandler.sendTo(p, effectMsg); // } // } // break; // default: break; // } // Switch // } //} //// Do not send a packet if nothing happened in p's range. //if (itemMsg.getLength() > 2) // gameHandler.sendTo(p, itemMsg); }
ThingType mType; /**< Type of this thing. */ #endregion Fields #region Constructors //, MapComposite *map = 0) public Thing(ThingType type) { mMap=null; mType=type; }
void updateMapVar(MapComposite map, string name, string value) { MessageOut msg=new MessageOut(Protocol.GAMSG_SET_VAR_MAP); msg.writeInt32(map.getID()); msg.writeString(name); msg.writeString(value); send(msg); }
public WarpAction(MapComposite m, int x, int y) { mMap=m; mX=(ushort)x; mY=(ushort)y; }
void updateMapVar(MapComposite map, string name, string value) { //MessageOut msg(GAMSG_SET_VAR_MAP); //msg.writeInt32(map.getID()); //msg.writeString(name); //msg.writeString(value); //send(msg); }
public new void setMap(MapComposite mapComposite) { Point p=getPosition(); MapComposite oldMapComposite=getMap(); if(oldMapComposite!=null) { Map oldMap=oldMapComposite.getMap(); int oldTileWidth=oldMap.getTileWidth(); int oldTileHeight=oldMap.getTileHeight(); oldMap.freeTile(p.x/oldTileWidth, p.y/oldTileHeight, getBlockType()); } base.setMap(mapComposite); //TODO Überprüfen ob es wie im ORiginal funktioniert Map map=mapComposite.getMap(); int tileWidth=map.getTileWidth(); int tileHeight=map.getTileHeight(); map.blockTile(p.x/tileWidth, p.y/tileHeight, getBlockType()); /* the last line might look illogical because the current position is * invalid on the new map, but it is necessary to block the old position * because the next call of setPosition() will automatically free the old * position. When we don't block the position now the occupation counting * will be off. */ }
/** * Sets the map this thing is located on. */ public virtual void setMap(MapComposite map) { mMap=map; }
public static int initialize(string mapReferenceFile) { // Indicates the number of maps loaded successfully int loadedMaps=0; XmlData doc=new XmlData(mapReferenceFile); if(doc.ExistElement("maps")==false) { Logger.Write(LogLevel.Error, "Item Manager: Error while parsing map database ({0})!", mapReferenceFile); return loadedMaps; } Logger.Write(LogLevel.Information, "Loading map reference: {0}", mapReferenceFile); //Für jeden Mapknoten List<XmlNode> nodes=doc.GetElements("maps.map"); foreach(XmlNode node in nodes) { if(node.Name!="map") continue; int id=Convert.ToInt32(node.Attributes["id"].Value); string name=node.Attributes["name"].Value; if(id>0&&name!="") { // Testing if the file is actually in the maps folder string file="maps/"+name+".tmx"; bool mapFileExists=ResourceManager.exists(file); if(mapFileExists) { maps[id]=new MapComposite(id, name); ++loadedMaps; } } else { if(name=="") { Logger.Write(LogLevel.Warning, "Invalid unnamed map Id: {0}.", id); } else { Logger.Write(LogLevel.Warning, "Invalid map Id: {0}.", id); } } } if(loadedMaps>0) { Logger.Write(LogLevel.Information, "{0} valid map file references were loaded.", loadedMaps); } return loadedMaps; }
static void warp(Character ptr, MapComposite map, int x, int y) { //remove(ptr); //ptr.setMap(map); //ptr.setPosition(Point(x, y)); //ptr.clearDestination(); ///* Force update of persistent data on map change, so that // characters can respawn at the start of the map after a death or // a disconnection. */ //accountHandler.sendCharacterData(ptr); //if (map.isActive()) //{ // if (!insert(ptr)) // { // ptr.disconnected(); // gameHandler.kill(ptr); // delete ptr; // } //} //else //{ // MessageOut msg(GAMSG_REDIRECT); // msg.writeInt32(ptr.getDatabaseID()); // accountHandler.send(msg); // gameHandler.prepareServerChange(ptr); //} }
/** * Updates object states on the map. */ static void updateMap(MapComposite map) { //// 1. update object status. //const std::vector< Thing * > &things = map.getEverything(); //for (std::vector< Thing * >::const_iterator i = things.begin(), // i_end = things.end(); i != i_end; ++i) //{ // (*i).update(); //} //// 2. run scripts. //if (Script *s = map.getScript()) //{ // s.update(); //} //// 3. perform actions. //for (BeingIterator i(map.getWholeMapIterator()); i; ++i) //{ // (*i).perform(); //} //// 4. move objects around and update zones. //for (BeingIterator i(map.getWholeMapIterator()); i; ++i) //{ // (*i).move(); //} //map.update(); }
static void enqueueWarp(Character ptr, MapComposite m, int x, int y) { //DelayedEvent e = { EVENT_WARP, x, y, m }; //enqueueEvent(ptr, e); }
public Thing(ThingType type, MapComposite map) { mMap=map; mType=type; }