public static byte[] NpcLeaveField(Npc npc) { var packet = new PacketWriter(); packet.WriteOpcode(SendOps.NpcLeaveField); packet.WriteInt(npc.mObjectID); return packet.ToArray(); }
public static int CacheFieldData() { int ret = 0; foreach (NXNode mapnode in Map.BaseNode.GetChild("Map")) { if (!mapnode.Name.StartsWith("Map")) continue; foreach (NXNode mapimg in mapnode) { CField field = new CField(); field.FieldID = int.Parse(mapimg.Name.Replace(".img", "")); NXNode node = mapimg.GetChild("info"); foreach (NXNode childnode in node) switch (childnode.Name) { case "bgm": field.WzData.bgm = GetStringFromChild(node, childnode.Name); break; case "cloud": field.WzData.cloud = GetIntFromChild(node, childnode.Name); break; case "swim": field.WzData.swim = GetIntFromChild(node, childnode.Name); break; case "forcedReturn": field.WzData.forcedReturn = GetIntFromChild(node, childnode.Name); break; case "hideMinimap": field.WzData.hideMinimap = GetIntFromChild(node, childnode.Name); break; case "mapDesc": field.WzData.mapDesc = GetStringFromChild(node, childnode.Name); break; case "mapMark": field.WzData.MapMark = GetStringFromChild(node, childnode.Name); break; case "mobRate": field.WzData.mobRate = GetFloatFromChild(node, childnode.Name); break; case "moveLimit": field.WzData.moveLimit = GetIntFromChild(node, childnode.Name); break; case "returnMap": field.WzData.returnMap = GetIntFromChild(node, childnode.Name); break; case "town": field.WzData.town = GetIntFromChild(node, childnode.Name); break; case "fieldLimit": int fl = GetIntFromChild(node, childnode.Name); if (fl >= (int) Math.Pow(2, 23)) fl = fl & ((int) Math.Pow(2, 23) - 1); field.WzData.fieldLimit = (FieldLimit) fl; break; case "VRTop": case "VRBottom": case "VRLeft": case "VRRight": break; case "timeLimit": field.WzData.timeLimit = GetIntFromChild(node, childnode.Name); break; case "lvLimit": field.WzData.lvLimit = GetIntFromChild(node, childnode.Name); break; case "onFirstUserEnter": field.WzData.onFirstUserEnter = GetStringFromChild(node, childnode.Name); break; case "onUserEnter": field.WzData.onUserEnter = GetStringFromChild(node, childnode.Name); break; case "fly": field.WzData.fly = GetIntFromChild(node, childnode.Name); break; case "noMapCmd": field.WzData.noMapCmd = GetIntFromChild(node, childnode.Name); break; case "partyOnly": field.WzData.partyOnly = GetIntFromChild(node, childnode.Name); break; case "fieldType": int ft = GetIntFromChild(node, childnode.Name); if (!Enum.IsDefined(typeof (FieldType), ft)) ft = 0; field.WzData.fieldType = (FieldType) ft; break; case "miniMapOnOff": field.WzData.miniMapOnOff = GetIntFromChild(node, childnode.Name); break; case "reactorShuffle": field.WzData.reactorShuffle = GetIntFromChild(node, childnode.Name); break; case "reactorShuffleName": field.WzData.reactorShuffleName = GetStringFromChild(node, childnode.Name); break; case "personalShop": field.WzData.personalShop = GetIntFromChild(node, childnode.Name); break; case "entrustedShop": field.WzData.entrustedShop = GetIntFromChild(node, childnode.Name); break; case "effect": field.WzData.effect = GetStringFromChild(node, childnode.Name); break; case "lvForceMove": field.WzData.lvForceMove = GetIntFromChild(node, childnode.Name); break; case "timeMob": field.WzData.startHour = GetIntFromChild(node, "startHour"); field.WzData.endHour = GetIntFromChild(node, "endHour"); int? id = GetIntFromChild(node, "id"); string message = GetStringFromChild(node, "message"); if (id == null || message == null || (field.WzData.startHour == null ^ field.WzData.endHour == null)) break; else field.WzData.timeMob = new FieldWzData.TimeMob(field.WzData.startHour, field.WzData.endHour, (int) id, message); break; case "help": field.WzData.help = GetStringFromChild(node, childnode.Name); break; case "snow": field.WzData.snow = GetIntFromChild(node, childnode.Name); break; case "rain": field.WzData.rain = GetIntFromChild(node, childnode.Name); break; case "dropExpire": field.WzData.dropExpire = GetIntFromChild(node, childnode.Name); break; case "decHP": field.WzData.decHP = GetIntFromChild(node, childnode.Name); break; case "decInterval": field.WzData.decInterval = GetIntFromChild(node, childnode.Name); break; case "autoLieDetector": field.WzData.startHour = GetIntFromChild(node, "startHour"); field.WzData.endHour = GetIntFromChild(node, "endHour"); int? interval = GetIntFromChild(node, "interval"); int? propInt = GetIntFromChild(node, "prop"); if (field.WzData.startHour == null || field.WzData.endHour == null || interval == null || propInt == null) { break; } else field.WzData.autoLieDetector = new FieldWzData.AutoLieDetector((int) field.WzData.startHour, (int) field.WzData.endHour, (int) interval, (int) propInt); break; case "expeditionOnly": field.WzData.expeditionOnly = GetIntFromChild(node, childnode.Name); break; case "fs": field.WzData.fs = GetFloatFromChild(node, childnode.Name); break; case "protectItem": field.WzData.protectItem = GetIntFromChild(node, childnode.Name); break; case "createMobInterval": field.WzData.createMobInterval = GetIntFromChild(node, childnode.Name); break; case "fixedMobCapacity": field.WzData.fixedMobCapacity = GetIntFromChild(node, childnode.Name); break; case "streetName": field.WzData.streetName = GetStringFromChild(node, childnode.Name); break; case "mapName": field.WzData.mapName = GetStringFromChild(node, childnode.Name); break; case "noRegenMap": field.WzData.noRegenMap = GetIntFromChild(node, childnode.Name); break; case "recovery": field.WzData.recovery = GetFloatFromChild(node, childnode.Name); break; case "blockPBossChange": field.WzData.blockPBossChange = GetIntFromChild(node, childnode.Name); break; case "everlast": field.WzData.everlast = GetIntFromChild(node, childnode.Name); break; case "damageCheckFree": field.WzData.damageCheckFree = GetIntFromChild(node, childnode.Name); break; case "dropRate": field.WzData.dropRate = GetFloatFromChild(node, childnode.Name); break; case "scrollDisable": field.WzData.scrollDisable = GetIntFromChild(node, childnode.Name); break; case "needSkillForFly": field.WzData.needSkillForFly = GetIntFromChild(node, childnode.Name); break; case "zakum2Hack": field.WzData.zakum2Hack = GetIntFromChild(node, childnode.Name); break; case "allMoveCheck": field.WzData.allMoveCheck = GetIntFromChild(node, childnode.Name); break; case "VRLimit": field.WzData.VRLimit = GetIntFromChild(node, childnode.Name); break; case "consumeItemCoolTime": field.WzData.consumeItemCoolTime = GetIntFromChild(node, childnode.Name); break; } if (mapimg.ContainsChild("life")) { node = mapimg.GetChild("life"); foreach (NXNode childnode in node) { string type = GetStringFromChild(childnode, "type"); if (type == "m") { var monster = new Monster(); monster.mID = GetIntFromChild(childnode, "id"); monster.mX = GetIntFromChild(childnode, "x"); monster.mY = GetIntFromChild(childnode, "y"); monster.mMobTime = GetIntFromChild(childnode, "mobTime"); monster.mF = GetIntFromChild(childnode, "f"); monster.mHide = GetIntFromChild(childnode, "hide"); monster.mFh = GetIntFromChild(childnode, "fh"); monster.mCy = GetIntFromChild(childnode, "cy"); monster.mRx0 = GetIntFromChild(childnode, "rx0"); monster.mRx1 = GetIntFromChild(childnode, "rx1"); field.AddFieldObject(monster); } else if (type == "n") { var npc = new Npc(); npc.mID = GetIntFromChild(childnode, "id"); npc.mX = GetIntFromChild(childnode, "x"); npc.mY = GetIntFromChild(childnode, "y"); npc.mF = GetIntFromChild(childnode, "f"); npc.mFh = GetIntFromChild(childnode, "fh"); npc.mCy = GetIntFromChild(childnode, "cy"); npc.mRx0 = GetIntFromChild(childnode, "rx0"); npc.mRx1 = GetIntFromChild(childnode, "rx1"); field.AddFieldObject(npc); } } } /*if (mapimg.ContainsChild("reactor")) { node = mapimg.GetChild("reactor"); foreach (NXNode childnode in node) switch (childnode.Name) { } } if (mapimg.ContainsChild("foothold")) { node = mapimg.GetChild("foothold"); foreach (NXNode childnode in node) switch (childnode.Name) { } } if (mapimg.ContainsChild("ladderRope")) { node = mapimg.GetChild("ladderRope"); foreach (NXNode childnode in node) switch (childnode.Name) { } }*/ if (mapimg.ContainsChild("foothold")) { node = mapimg.GetChild("foothold"); field.mFootholdTree.mField = field; foreach (NXNode layernode in node) { foreach (NXNode groupnode in node) { foreach (NXNode footholdnode in node) { Foothold foothold = new Foothold(); foothold.mFootholdTree = field.mFootholdTree; foothold.mLayerID = int.Parse(layernode.Name); foothold.mGroupID = int.Parse(groupnode.Name); foothold.mID = int.Parse(footholdnode.Name); foothold.mStart = new Point(GetIntFromChild(footholdnode, "x1"), GetIntFromChild(footholdnode, "y1")); foothold.mEnd = new Point(GetIntFromChild(footholdnode, "x2"), GetIntFromChild(footholdnode, "y2")); foothold.mPrevious = GetIntFromChild(footholdnode, "prev"); foothold.mNext = GetIntFromChild(footholdnode, "next"); foothold.mForce = GetIntFromChild(footholdnode, "force"); foothold.mForbidFallDown = GetIntFromChild(footholdnode, "forbidFallDown"); foothold.mPiece = GetIntFromChild(footholdnode, "piece"); field.mFootholdTree.mFootholds.Add(foothold); } } } } if (mapimg.ContainsChild("seat")) { node = mapimg.GetChild("seat"); foreach (NXNode childnode in node) { Seat seat = new Seat(); int id = int.Parse(childnode.Name); seat.mID = id; seat.mPosition = GetPointFromChild(node, childnode.Name); field.AddFieldObject(seat); } } if (mapimg.ContainsChild("portal")) { node = mapimg.GetChild("portal"); foreach (NXNode childnode in node) { Portal portal = new Portal(); portal.mPortalID = int.Parse(childnode.Name); portal.mName = GetStringFromChild(childnode, "pn"); portal.mPosition = new Point(GetIntFromChild(childnode, "x"), GetIntFromChild(childnode, "y")); portal.mDestinationMapID = GetIntFromChild(childnode, "tm"); portal.mDestinationName = GetStringFromChild(childnode, "tn"); portal.mOnce = GetIntFromChild(childnode, "onlyOnce"); switch (portal.mName) { case "sp": portal.mType = PortalType.Startpoint; break; case "pi": portal.mType = PortalType.Invisible; break; case "pv": portal.mType = PortalType.Visible; break; case "pc": portal.mType = PortalType.Collision; break; case "pg": portal.mType = PortalType.Changable; break; case "pgi": portal.mType = PortalType.ChangableInvisible; break; case "tp": portal.mType = PortalType.TownportalPoint; break; case "ps": portal.mType = PortalType.Script; break; case "psi": portal.mType = PortalType.ScriptInvisible; break; case "pcs": portal.mType = PortalType.CollisionScript; break; case "ph": portal.mType = PortalType.Hidden; break; case "psh": portal.mType = PortalType.ScriptHidden; break; case "pcj": portal.mType = PortalType.CollisionVerticalJump; break; case "pci": portal.mType = PortalType.CollisionCustomImpact; break; case "pcig": portal.mType = PortalType.CollisionUnknownPcig; break; } field.AddFieldObject(portal); } } NXDataCache.Field.Add(field.FieldID, field); ret++; } } return ret; }
public static byte[] NpcEnterField(Npc npc, bool show = true) { var packet = new PacketWriter(); packet.WriteOpcode(SendOps.NpcEnterField); packet.WriteInt(npc.mObjectID); packet.WriteInt(npc.mID); packet.WriteShort(npc.mX); packet.WriteShort(npc.mCy); packet.WriteByte(Math.Abs(npc.mF - 1)); packet.WriteShort(npc.mFh); packet.WriteShort(npc.mRx0); packet.WriteShort(npc.mRx1); packet.WriteBool(show); // visible return packet.ToArray(); }