private void OnCollisionEnter2D(Collision2D other) { IFieldObject fo = other.gameObject.GetComponent <IFieldObject>(); if (fo == null) { return; } EventParameter param = new EventParameter( "Name".EventParameterPairing(gameObject.name), "Target".EventParameterPairing(fo) ); EventController.Instance.EventCall("ZoneEnterEvent", param); }
public override void Execute(GameCommandTrigger trigger) { string jobName = trigger.Get <string>("job"); byte awakened = trigger.Get <byte>("awakened"); Player player = trigger.Session.Player; IFieldObject <Player> fieldPlayer = trigger.Session.Player.FieldPlayer; long activeSkillTabId = player.ActiveSkillTabId; SkillTab skillTab = player.SkillTabs.First(tab => tab.TabId == activeSkillTabId); if (string.IsNullOrEmpty(jobName)) { string[] classes = Enum.GetNames(typeof(Job)); player.Session.Send(NoticePacket.Notice("You have to give a classname and specifiy awakening (1 or 0)\nAvailable classes:\n".Bold().Color(Color.DarkOrange) + $"{string.Join(", ", classes).Color(Color.Aquamarine)}", NoticeType.Chat)); return; } Job job = Job.None; if (!Enum.TryParse(jobName, true, out job)) { player.Session.SendNotice($"{jobName} is not a valid class name"); return; } if (job == Job.None) { player.Session.SendNotice("None is not a valid class"); return; } if (job != player.Job) { DatabaseManager.SkillTabs.Delete(skillTab.Uid); SkillTab newSkillTab = new(player.CharacterId, job, skillTab.TabId, skillTab.Name); player.SkillTabs[player.SkillTabs.IndexOf(skillTab)] = newSkillTab; player.Job = job; } player.Awakened = awakened == 1; trigger.Session.Send(JobPacket.SendJob(fieldPlayer)); }
public void AddPlayer(GameSession sender, IFieldObject <Player> player) { Debug.Assert(player.ObjectId > 0, "Player was added to field without initialized objectId."); player.Coord = player.Value.Coord; player.Value.MapId = MapId; // TODO: Determine new coordinates for player as well lock (Sessions) { Sessions.Add(sender); } // TODO: Send the initialization state of the field foreach (IFieldObject <Player> existingPlayer in State.Players.Values) { sender.Send(FieldPacket.AddPlayer(existingPlayer)); sender.Send(FieldObjectPacket.LoadPlayer(existingPlayer)); } foreach (IFieldObject <Item> existingItem in State.Items.Values) { sender.Send(FieldPacket.AddItem(existingItem, 123456)); } foreach (IFieldObject <Npc> existingNpc in State.Npcs.Values) { sender.Send(FieldPacket.AddNpc(existingNpc)); sender.Send(FieldObjectPacket.LoadNpc(existingNpc)); } foreach (IFieldObject <Portal> existingPortal in State.Portals.Values) { sender.Send(FieldPacket.AddPortal(existingPortal)); } foreach (IFieldObject <Mob> existingMob in State.Mobs.Values) { sender.Send(FieldPacket.AddMob(existingMob)); sender.Send(FieldObjectPacket.LoadMob(existingMob)); } if (State.InteractActors.Values.Count > 0) { sender.Send(InteractActorPacket.AddInteractActors(State.InteractActors.Values)); } State.AddPlayer(player); // Broadcast new player to all players in map Broadcast(session => { session.Send(FieldPacket.AddPlayer(player)); session.Send(FieldObjectPacket.LoadPlayer(player)); }); }
private static void HandleHomePortal(GameSession session, IFieldObject <Portal> fieldPortal) { IFieldObject <Cube> srcCube = session.FieldManager.State.Cubes.Values .FirstOrDefault(x => x.Value.PortalSettings is not null && x.Value.PortalSettings.PortalObjectId == fieldPortal.ObjectId); if (srcCube is null) { return; } string destinationTarget = srcCube.Value.PortalSettings.DestinationTarget; if (string.IsNullOrEmpty(destinationTarget)) { return; } switch (srcCube.Value.PortalSettings.Destination) { case UgcPortalDestination.PortalInHome: IFieldObject <Cube> destinationCube = session.FieldManager.State.Cubes.Values .FirstOrDefault(x => x.Value.PortalSettings is not null && x.Value.PortalSettings.PortalName == destinationTarget); if (destinationCube is null) { return; } session.Player.FieldPlayer.Coord = destinationCube.Coord; CoordF coordF = destinationCube.Coord; session.Player.Move(coordF, session.Player.FieldPlayer.Rotation); break; case UgcPortalDestination.SelectedMap: session.Player.Warp(int.Parse(destinationTarget)); break; case UgcPortalDestination.FriendHome: long friendAccountId = long.Parse(destinationTarget); Home home = GameServer.HomeManager.GetHomeById(friendAccountId); if (home is null) { return; } session.Player.WarpGameToGame((int)Map.PrivateResidence, instanceId: home.InstanceId); break; } }
public static Packet UpdateMobStats(IFieldObject <Mob> mob) { PacketWriter pWriter = PacketWriter.Of(SendOp.STAT); pWriter.WriteInt(mob.ObjectId); pWriter.WriteByte(); pWriter.WriteByte(1); pWriter.WriteByte(4); // value // Stats // Damage should be update through this packet for (int i = 0; i < 3; i++) { pWriter.WriteLong(mob.Value.stats.Hp[i]); } return(pWriter); }
public static Packet UpdateStats(IFieldObject<Player> player, PlayerStatId statId, params PlayerStatId[] otherIds) { PacketWriter pWriter = PacketWriter.Of(SendOp.STAT); pWriter.WriteInt(player.ObjectId); pWriter.WriteEnum(StatsMode.UpdateStats); pWriter.WriteByte((byte) (1 + otherIds.Length)); pWriter.WriteEnum(statId); pWriter.WriteStat(statId, player.Value.Stats[statId]); foreach (PlayerStatId otherId in otherIds) { pWriter.WriteEnum(otherId); pWriter.WriteStat(otherId, player.Value.Stats[otherId]); } return pWriter; }
public static Packet RequestEnter(IFieldObject <Player> player) { PacketWriter pWriter = PacketWriter.Of(SendOp.REQUEST_FIELD_ENTER); pWriter.WriteByte(0x00); pWriter.WriteInt(player.Value.MapId); pWriter.WriteByte(); pWriter.WriteByte(); pWriter.WriteInt(); pWriter.WriteInt(); pWriter.Write(player.Coord); pWriter.Write(player.Value.Rotation); pWriter.WriteInt(); // Whatever is here seems to be repeated by client in FIELD_ENTER response. return(pWriter); }
public bool Remove(IFieldObject item) { bool result = false; for (int i = 0; i < _fieldobjects.Count; i++) { var curFieldObject = _fieldobjects[i]; if (Equals(curFieldObject, item)) { _fieldobjects.RemoveAt(i); result = true; break; } } return(result); }
public void AddBalloonTalk(int spawnPointId, string msg, int duration, int delayTick, bool isNpcId) { if (!isNpcId) { if (spawnPointId == 0) { IFieldObject <Player> player = Field.State.Players.Values.First(); if (player == null) { return; } player.Value.Session.Send(CinematicPacket.BalloonTalk(player.ObjectId, isNpcId, msg, duration, delayTick)); return; } } }
public void SetInteractObject(int[] interactObjectIds, byte state, bool arg4, bool arg3) { InteractObjectState objectState = (InteractObjectState)state; foreach (int interactObjectId in interactObjectIds) { IFieldObject <InteractObject> interactObject = Field.State.InteractObjects.Values.FirstOrDefault(x => x.Value.InteractId == interactObjectId); if (interactObject == null) { continue; } interactObject.Value.State = objectState; Field.BroadcastPacket(InteractObjectPacket.Set(interactObject.Value)); } }
public static Packet Use(IFieldObject <Player> fieldPlayer, bool start, int itemId = 0, long itemUid = 0) { PacketWriter pWriter = PacketWriter.Of(SendOp.SET_BUILD_MODE); pWriter.WriteInt(fieldPlayer.ObjectId); pWriter.WriteBool(start); if (start) { pWriter.WriteInt(itemId); pWriter.WriteLong(itemUid); pWriter.WriteLong(); pWriter.WriteByte(); pWriter.WriteInt(); } return(pWriter); }
public static Packet LoadHome(IFieldObject <Player> fieldPlayer) { PacketWriter pWriter = PacketWriter.Of(SendOp.RESPONSE_CUBE); pWriter.WriteEnum(ResponseCubePacketMode.LoadHome); pWriter.WriteInt(fieldPlayer.ObjectId); pWriter.WriteInt(fieldPlayer.Value.HomeMapId); pWriter.WriteInt(fieldPlayer.Value.PlotMapId); pWriter.WriteInt(fieldPlayer.Value.HomePlotNumber); pWriter.WriteInt(fieldPlayer.Value.ApartmentNumber); pWriter.WriteUnicodeString(fieldPlayer.Value.HomeName); pWriter.WriteLong(fieldPlayer.Value.HomeExpiration); pWriter.WriteLong(); pWriter.WriteByte(1); return(pWriter); }
public void SetPortal(int portalId, bool visible, bool enabled, bool minimapVisible, bool arg5) { if (Field.State.Portals.IsEmpty) { return; } IFieldObject <Portal> portal = Field.State.Portals.Values.FirstOrDefault(p => p.Value.Id == portalId); if (portal == null) { return; } portal.Value.Update(visible, enabled, minimapVisible); Field.BroadcastPacket(FieldPortalPacket.UpdatePortal(portal)); }
public void RemovePlayer(GameSession sender, IFieldObject <Player> player) { lock (sessions) { sessions.Remove(sender); } State.RemovePlayer(player.ObjectId); // Remove player Broadcast(session => { session.Send(FieldPacket.RemovePlayer(player)); }); ((FieldObject <Player>)player).ObjectId = -1; // Reset object id }
public static Packet PlayScore(IFieldObject <Player> player, string itemFileName) { PacketWriter pWriter = PacketWriter.Of(SendOp.PLAY_INSTRUMENT); pWriter.WriteEnum(InstrumentPacketMode.PlayScore); pWriter.WriteByte(); pWriter.WriteInt(player.ObjectId); pWriter.WriteInt(player.ObjectId); pWriter.Write(player.Coord); pWriter.WriteInt(0x616F09CE); // scoreUid? pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteByte(); pWriter.WriteUnicodeString(itemFileName); return(pWriter); }
private static void HandleAoeDamage(GameSession session, PacketReader packet) { List <(IFieldObject <Mob>, DamageHandler)> mobs = new List <(IFieldObject <Mob>, DamageHandler)>(); long skillSN = packet.ReadLong(); int unkValue = packet.ReadInt(); int playerObjectId = packet.ReadInt(); CoordF coords = packet.Read <CoordF>(); CoordF coords2 = packet.Read <CoordF>(); CoordF coords3 = packet.Read <CoordF>(); packet.ReadByte(); byte count = packet.ReadByte(); packet.ReadInt(); bool isCrit = DamageHandler.RollCrit(session.Player.Stats[PlayerStatId.CritRate].Current); for (int i = 0; i < count; i++) { int entity = packet.ReadInt(); packet.ReadByte(); IFieldObject <Mob> mob = session.FieldManager.State.Mobs.GetValueOrDefault(entity); if (mob != null) { DamageHandler damage = DamageHandler.CalculateDamage(session.FieldPlayer.Value.SkillCast, session.FieldPlayer.Value, mob.Value, isCrit); mob.Value.Damage(damage.Damage); session.Send(StatPacket.UpdateMobStats(mob)); if (mob.Value.IsDead) { HandleMobKill(session, mob); } if (mob.Value.Id == 29000128) // Temp fix for tutorial barrier { session.Send("4F 00 03 E8 03 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray()); session.Send("4F 00 03 D0 07 00 00 00 00 00 00 00 00 00 00 00 00 80 3F".ToByteArray()); session.Send("4F 00 08 01 04 01 00 00".ToByteArray()); } mobs.Add((mob, damage)); } } session.Send(SkillDamagePacket.ApplyDamage(skillSN, unkValue, coords, session.FieldPlayer, mobs)); }
private static void DoDirChange(ITank tank, IFieldObject obstacle) { ITank saveTank = new Tank(tank.Width, tank.Height, tank.X, tank.Y); saveTank.Direction = tank.Direction; var dir = DirectionsForTank(tank); if (dir.Length == 1) { DoDir(dir[0], tank); } else { double left = Math.Max(tank.X, obstacle.X); double top = Math.Min(tank.Y + tank.Height, obstacle.Y + obstacle.Height); double right = Math.Min(tank.X + tank.Width, obstacle.X + obstacle.Width); double bottom = Math.Max(tank.Y, obstacle.Y); double width = right - left; double height = top - bottom; if (width > height) { if (dir[0] == Directions.Down || dir[0] == Directions.Up) { DoDir(dir[0], tank); } else if (dir[1] == Directions.Down || dir[1] == Directions.Up) { DoDir(dir[1], tank); } } else { if (dir[0] == Directions.Left || dir[0] == Directions.Right) { DoDir(dir[0], tank); } else if (dir[1] == Directions.Left || dir[1] == Directions.Right) { DoDir(dir[1], tank); } } } }
private static void UpdateAllPortals(GameSession session) { foreach (IFieldObject <Portal> fieldPortal in session.FieldManager.State.Portals.Values) { session.FieldManager.RemovePortal(fieldPortal); } // Re-add cube portals in map IEnumerable <IFieldObject <Cube> > fieldCubePortals = session.FieldManager.State.Cubes.Values.Where(x => x.Value.Item.Id == 50400158); foreach (IFieldObject <Cube> fieldCubePortal in fieldCubePortals) { Cube cubePortal = fieldCubePortal.Value; Portal portal = new(GuidGenerator.Int()) { IsVisible = true, IsEnabled = true, IsMinimapVisible = false, Rotation = cubePortal.Rotation, PortalType = PortalTypes.Home, UGCPortalMethod = cubePortal.PortalSettings.Method }; IFieldObject <Portal> fieldPortal = session.FieldManager.RequestFieldObject(portal); fieldPortal.Coord = cubePortal.CoordF; if (!string.IsNullOrEmpty(cubePortal.PortalSettings.DestinationTarget)) { switch (cubePortal.PortalSettings.Destination) { case UGCPortalDestination.PortalInHome: fieldPortal.Value.TargetMapId = (int)Map.PrivateResidence; break; case UGCPortalDestination.SelectedMap: fieldPortal.Value.TargetMapId = int.Parse(cubePortal.PortalSettings.DestinationTarget); break; case UGCPortalDestination.FriendHome: fieldPortal.Value.TargetHomeAccountId = long.Parse(cubePortal.PortalSettings.DestinationTarget); break; } } cubePortal.PortalSettings.PortalObjectId = fieldPortal.ObjectId; session.FieldManager.AddPortal(fieldPortal); } } }
public override void Execute(GameCommandTrigger trigger) { int id = trigger.Get <int>("id"); short level = trigger.Get <short>("level") > 0 ? trigger.Get <short>("level") : (short)1; if (SkillMetadataStorage.GetSkill(id) == null) { trigger.Session.SendNotice($"Skill with id: {id} is not defined."); return; } SkillCast skillCast = new SkillCast(id, level, GuidGenerator.Long(), trigger.Session.ServerTick, trigger.Session.FieldPlayer.ObjectId, trigger.Session.ClientTick); CoordF empty = CoordF.From(0, 0, 0); IFieldObject <Player> player = trigger.Session.FieldPlayer; trigger.Session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast, player.Coord, empty, empty)); }
// not sure about the name public static PacketWriter UpdateUGCItem(IFieldObject <Player> fieldPlayer, Item item) { PacketWriter pWriter = PacketWriter.Of(SendOp.UGC); pWriter.Write(UgcMode.UpdateUGC); pWriter.WriteInt(fieldPlayer.ObjectId); pWriter.WriteLong(item.Uid); pWriter.WriteInt(item.Id); pWriter.WriteInt(item.Amount); pWriter.WriteUnicodeString(item.UGC.Name); pWriter.WriteByte(1); // unknown pWriter.WriteLong(item.UGC.SalePrice); pWriter.WriteBool(false); // unknown pWriter.WriteUgcTemplate(item.UGC); return(pWriter); }
public static PacketWriter LoadFurnishingItem(IFieldObject <Player> player, int itemId, long itemUid, Item item = null) { PacketWriter pWriter = PacketWriter.Of(SendOp.ResponseCube); pWriter.Write(ResponseCubePacketMode.LoadFurnishingItem); pWriter.WriteInt(player.ObjectId); pWriter.WriteInt(itemId); pWriter.WriteLong(itemUid); pWriter.WriteLong(); pWriter.WriteBool(item?.Ugc is not null); if (item?.Ugc is not null) { pWriter.WriteClass(item.Ugc); } return(pWriter); }
public static PacketWriter Drop(IFieldObject <LiftableObject> fieldLiftableObject) { LiftableObject liftableObject = fieldLiftableObject.Value; PacketWriter pWriter = PacketWriter.Of(SendOp.Liftable); pWriter.Write(LiftableMode.Drop); pWriter.WriteString($"4_{fieldLiftableObject.Coord.ToByte().AsHexadecimal()}"); pWriter.WriteInt(liftableObject.ItemCount); pWriter.WriteUnicodeString(liftableObject.Metadata.MaskQuestId); pWriter.WriteUnicodeString(liftableObject.Metadata.MaskQuestState); pWriter.WriteUnicodeString(liftableObject.Metadata.EffectQuestId); pWriter.WriteUnicodeString(liftableObject.Metadata.EffectQuestState); pWriter.WriteBool(true); // effect return(pWriter); }
public static bool IsPlayerInBox(MapTriggerBox box, IFieldObject <Player> player) { CoordF minCoord = CoordF.From( box.Position.X - box.Dimension.X / 2, box.Position.Y - box.Dimension.Y / 2, box.Position.Z - box.Dimension.Z / 2); CoordF maxCoord = CoordF.From( box.Position.X + box.Dimension.X / 2, box.Position.Y + box.Dimension.Y / 2, box.Position.Z + box.Dimension.Z / 2); bool min = player.Coord.X >= minCoord.X && player.Coord.Y >= minCoord.Y && player.Coord.Z >= minCoord.Z; bool max = player.Coord.X <= maxCoord.X && player.Coord.Y <= maxCoord.Y && player.Coord.Z <= maxCoord.Z; return(min && max); }
public static void HandleOpen(GameSession session, IFieldObject <Npc> npcFieldObject) { NpcMetadata metadata = NpcMetadataStorage.GetNpc(npcFieldObject.Value.Id); ShopMetadata shop = ShopMetadataStorage.GetShop(metadata.ShopId); if (shop == null) { Console.WriteLine($"Unknown shop ID: {metadata.ShopId}"); return; } session.Send(ShopPacket.Open(shop)); session.Send(ShopPacket.LoadProducts(shop.Items)); session.Send(ShopPacket.Reload()); session.Send(NpcTalkPacket.Respond(npcFieldObject, NpcType.Default, DialogType.None, 0)); }
public IList <ICollidable> GetCollisions(IFieldObject targetObject, IEnumerable <IFieldObject> objectsOnField) { var targetObjectArea = targetObject.GetArea(); var objectsToCollide = new List <ICollidable>(); foreach (var fieldObject in objectsOnField) { var fieldObjectArea = fieldObject.GetArea(); if (fieldObjectArea.Intersects(targetObjectArea) > 0) { objectsToCollide.Add(fieldObject); } } return(objectsToCollide); }
private static void HandleInstallBillBoard(GameSession session, PacketReader packet, Item item) { string[] parameters = packet.ReadUnicodeString().Split("'"); string title = parameters[0]; string description = parameters[1]; bool publicHouse = parameters[2].Equals("1"); int balloonUid = GuidGenerator.Int(); string id = "AdBalloon_" + balloonUid; IFieldObject <InteractObject> fieldAdBallon = session.FieldManager.AddAdBalloon(new(id, item.Function.InstallBillboard.InteractId, InteractObjectState.Default, InteractObjectType.AdBalloon, session.Player, item.Function.InstallBillboard, title, description, publicHouse)); session.FieldManager.State.AddInteractObject(fieldAdBallon); session.FieldManager.BroadcastPacket(InteractObjectPacket.Add(fieldAdBallon)); session.Player.Inventory.ConsumeItem(session, item.Uid, 1); }
public static Packet Add(IFieldObject <Player> player) { PacketWriter pWriter = PacketWriter.Of(SendOp.GUIDE_OBJECT); pWriter.WriteEnum(GuideObjectPacketMode.Add); pWriter.WriteShort(player.Value.Guide.Value.Type); pWriter.WriteInt(player.Value.Guide.ObjectId); pWriter.WriteLong(player.Value.CharacterId); pWriter.Write(player.Value.Guide.Coord); pWriter.Write(player.Rotation); if (player.Value.Guide.Value.Type == 0) { pWriter.WriteLong(); } return(pWriter); }
public static PacketWriter Add(IFieldObject <GuideObject> guide) { PacketWriter pWriter = PacketWriter.Of(SendOp.GuideObject); pWriter.Write(GuideObjectPacketMode.Add); pWriter.WriteShort(guide.Value.Type); pWriter.WriteInt(guide.ObjectId); pWriter.WriteLong(guide.Value.BoundCharacterId); pWriter.Write(guide.Coord); pWriter.Write(guide.Rotation); if (guide.Value.Type == 0) { pWriter.WriteLong(); } return(pWriter); }
private static void HandleAddFurnishing(GameSession session, PacketReader packet) { CoordB coord = packet.Read <CoordB>(); byte padding = packet.ReadByte(); int itemId = packet.ReadInt(); long itemUid = packet.ReadLong(); byte padding2 = packet.ReadByte(); CoordF rotation = packet.Read <CoordF>(); int plotNumber = MapMetadataStorage.GetPlotNumber(session.Player.MapId, coord); if (plotNumber < 0) { return; } // TODO: Check if player has rights to this plot FurnishingShopMetadata shopMetadata = FurnishingShopMetadataStorage.GetMetadata(itemId); if (shopMetadata == null || !shopMetadata.Buyable) { return; } if (itemUid == 0) // player needs to purchase { if (!PurchaseFurnishingItem(session, shopMetadata)) { return; } Item item = new Item(itemId); //TODO: Add and remove appropriate item to warehouse inventory and furnishing inventory Cube cube = new Cube(item, plotNumber); IFieldObject <Cube> fieldCube = session.FieldManager.RequestFieldObject(cube); fieldCube.Coord = coord.ToFloat(); fieldCube.Rotation = rotation; session.FieldManager.AddCube(fieldCube, session.FieldPlayer); } }
public static PacketWriter Vibrate(string objectHash, SkillCast skillCast, IFieldObject <Player> player) { PacketWriter pWriter = PacketWriter.Of(SendOp.VIBRATE); pWriter.WriteByte(1); pWriter.WriteString(objectHash); pWriter.WriteLong(skillCast.SkillSn); pWriter.WriteInt(skillCast.SkillId); pWriter.WriteShort(skillCast.SkillLevel); pWriter.WriteByte(); // motion point? pWriter.WriteByte(); pWriter.Write(player.Coord.ToShort()); pWriter.Write(player.Value.Session.ServerTick); pWriter.WriteString(); pWriter.WriteByte(); return(pWriter); }