public static CoordF TileToWorld(CoordF tilePos) { const int w = TileWidth / 2; const int h = TileHeight / 2; return new CoordF( tilePos.X * w - tilePos.Y * w, tilePos.X * h + tilePos.Y * h ); }
public CoordF ScreenToTile(CoordF screenPos) { const int w = TileWidth / 2; const int h = TileHeight / 2; const float wh2 = 2 * w * h; int xoff = -(int)ViewOffset.X; int yoff = -(int)ViewOffset.Y; return new CoordF( (screenPos.X * h + screenPos.Y * w - xoff * h - yoff * w) / wh2, (-screenPos.X * h + screenPos.Y * w + xoff * h - yoff * w) / wh2 ); }
public Cube(Item item, int plotNumber, CoordF coordF, CoordF rotation, long homeLayoutId = 0, long homeId = 0) { Item = item; PlotNumber = plotNumber; CoordF = coordF; Rotation = rotation; HomeId = homeId; LayoutUid = homeLayoutId; if (item.Id == 50400158) // Portal cube { PortalSettings = new(coordF.ToByte()); } Uid = DatabaseManager.Cubes.Insert(this); }
public void Warp(CoordF coord, CoordF rotation, int mapId) { MapId = mapId; Coord = coord; Rotation = rotation; SafeBlock = coord; if (!UnlockedMaps.Contains(MapId)) { UnlockedMaps.Add(MapId); } DatabaseManager.UpdateCharacter(this); Session.Send(FieldPacket.RequestEnter(Session.FieldPlayer)); }
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 List <CoordF> SelectPoints(int spawnRadius = Block.BLOCK_SIZE) { List <CoordF> spawnOffsets = new List <CoordF>(); int spawnSize = 2 * (spawnRadius / Block.BLOCK_SIZE); for (int i = 0; i <= spawnSize; i++) { for (int j = 0; j <= spawnSize; j++) { spawnOffsets.Add(CoordF.From(i * Block.BLOCK_SIZE - spawnRadius, j * Block.BLOCK_SIZE - spawnRadius, 0)); } } Random offsetRNG = new Random(); return(spawnOffsets.OrderBy(x => offsetRNG.Next()).ToList()); }
public MapLiftableObject(string entityId, int itemId, int itemStackCount, string maskQuestId, string maskQuestState, string effectQuestId, string effectQuestState, int itemLifeTime, int regenCheckTime, int liftableFinishTime, CoordF position, CoordF rotation) { EntityId = entityId; ItemId = itemId; ItemStackCount = itemStackCount; MaskQuestId = maskQuestId; MaskQuestState = maskQuestState; EffectQuestId = effectQuestId; EffectQuestState = effectQuestState; ItemLifeTime = itemLifeTime; LiftableRegenCheckTime = regenCheckTime; LiftableFinishTime = liftableFinishTime; Position = position; Rotation = rotation; }
private static void HandleFirstSent(GameSession session, PacketReader packet) { long skillSN = packet.ReadLong(); int unkValue = packet.ReadInt(); int skillId = packet.ReadInt(); short skillLevel = packet.ReadShort(); packet.ReadByte(); CoordF coords = packet.Read <CoordF>(); packet.ReadShort(); SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, unkValue); session.FieldPlayer.Value.SkillCast = skillCast; session.Send(SkillUsePacket.SkillUse(skillCast, coords)); }
public MobCommand() { Aliases = new() { "mob" }; Description = "Spawn a MOB from id."; Parameters = new() { new Parameter <int>("id", "The id of the MOB.", 21000001), new Parameter <short>("ani", "The animation of the MOB.", 1), new Parameter <short>("dir", "The rotation of the MOB.", 2700), new Parameter <CoordF>("coord", "The position of the MOB.", CoordF.From(0, 0, 0)), }; Usage = "/mob [id] [ani] [dir] [coord]"; }
public NpcCommand() { Aliases = new() { "npc" }; Description = "Spawn a NPC from id."; Parameters = new() { new Parameter <int>("id", "The id of the NPC.", 11003146), new Parameter <short>("ani", "The animation of the NPC.", 1), new Parameter <short>("dir", "The rotation of the NPC.", 2700), new Parameter <CoordF>("coord", "The position of the NPC.", CoordF.From(0, 0, 0)), }; Usage = "/npc [id] [ani] [dir] [coord]"; }
public long ExpirationTimestamp; // TODO: Remove from field if expired public AdBalloon(string id, int interactId, InteractObjectState state, InteractObjectType type, IFieldObject <Player> owner, InstallBillboard metadata, string title, string description, bool publicHouse) : base(id, interactId, type, state) { Owner = owner.Value; Position = owner.Coord; Rotation = owner.Rotation; Model = metadata.Model; Asset = metadata.Asset; NormalState = metadata.NormalState; Reactable = metadata.Reactable; Scale = metadata.Scale; Title = title; Description = description; PublicHouse = publicHouse; CreationTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount; ExpirationTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + Environment.TickCount + metadata.Duration; }
// Initializes all values to be saved into the database public Player(long accountId, string name, byte gender, Job job, SkinColor skinColor) { AccountId = accountId; Name = name; Gender = gender; Job = job; GameOptions = new GameOptions(); Wallet = new Wallet(this, meso: 0, meret: 0, gameMeret: 0, eventMeret: 0, valorToken: 0, treva: 0, rue: 0, haviFruit: 0, mesoToken: 0, bank: 0); Levels = new Levels(this, playerLevel: 1, exp: 0, restExp: 0, prestigeLevel: 1, prestigeExp: 0, new List <MasteryExp>()); Timestamps = new TimeInfo(DateTimeOffset.UtcNow.ToUnixTimeSeconds()); MapId = 52000065; Coord = CoordF.From(-675, 525, 600); // Intro map (52000065) Stats = new PlayerStats(strBase: 10, dexBase: 10, intBase: 10, lukBase: 10, hpBase: 500, critRateBase: 10); Motto = "Motto"; ProfileUrl = ""; HomeName = "HomeName"; CreationTime = DateTimeOffset.Now.ToUnixTimeSeconds() + Environment.TickCount; TitleId = 0; InsigniaId = 0; Titles = new List <int>(); ChatSticker = new List <ChatSticker>(); FavoriteStickers = new List <int>(); Emotes = new List <int>() { 90200011, 90200004, 90200024, 90200041, 90200042, 90200057, 90200043, 90200022, 90200031, 90200005, 90200006, 90200003, 90200092, 90200077, 90200073, 90200023, 90200001, 90200019, 90200020, 90200021 }; SkillTabs = new List <SkillTab> { new SkillTab(job) }; StatPointDistribution = new StatDistribution(20); Inventory = new Inventory(); BankInventory = new BankInventory(); Mailbox = new Mailbox(); BuddyList = new List <Buddy>(); QuestList = new List <QuestStatus>(); TrophyCount = new int[3] { 0, 0, 0 }; ReturnMapId = (int)Map.Tria; ReturnCoord = CoordF.From(-900, -900, 3000); GroupChatId = new int[3]; SkinColor = skinColor; UnlockedTaxis = new List <int>(); UnlockedMaps = new List <int>(); CharacterId = DatabaseManager.CreateCharacter(this); }
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)); }
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)); }
private static void HandleSyncSkills(GameSession session, PacketReader packet) { long skillSN = packet.ReadLong(); int skillId = packet.ReadInt(); short skillLevel = packet.ReadShort(); byte motionPoint = packet.ReadByte(); CoordF position = packet.Read <CoordF>(); CoordF unkCoords = packet.Read <CoordF>(); CoordF rotation = packet.Read <CoordF>(); CoordF unknown = packet.Read <CoordF>(); bool toggle = packet.ReadBool(); packet.ReadInt(); packet.ReadByte(); session.FieldManager.BroadcastPacket(SkillSyncPacket.Sync(skillSN, session.FieldPlayer, position, rotation, toggle), session); }
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); }
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 Player Char2(long accountId, long characterId, string name = "Char2") { int job = 50; PlayerStats stats = PlayerStats.Default(); List <SkillTab> skillTabs = new List <SkillTab> { XmlParser.ParseSkills(job) }; return(new Player { SkillTabs = skillTabs, MapId = 2000062, AccountId = accountId, CharacterId = characterId, Level = 70, Name = name, Gender = 0, Motto = "Motto", HomeName = "HomeName", Coord = CoordF.From(2850, 2550, 1800), JobGroupId = job, SkinColor = new SkinColor() { Primary = Color.Argb(0xFF, 0xEA, 0xBF, 0xAE) }, CreationTime = DateTimeOffset.Now.ToUnixTimeSeconds() + Environment.TickCount, Equips = new Dictionary <ItemSlot, Item> { { ItemSlot.ER, Item.EarMale() }, { ItemSlot.HR, Item.HairMale() }, { ItemSlot.FA, Item.FaceMale() }, { ItemSlot.FD, Item.FaceDecorationMale() }, { ItemSlot.CL, Item.CloathMale() }, { ItemSlot.SH, Item.ShoesMale() }, }, Stats = stats, GameOptions = new GameOptions(), Mesos = 10, Inventory = new Inventory(48), Mailbox = new Mailbox() }); }
public static PacketWriter Sync(SkillCast skillCast, IFieldObject <Player> player, CoordF position, CoordF rotation, bool toggle) { PacketWriter pWriter = PacketWriter.Of(SendOp.SKILL_SYNC); pWriter.WriteLong(skillCast.SkillSn); pWriter.WriteInt(player.ObjectId); pWriter.WriteInt(skillCast.SkillId); pWriter.WriteShort(skillCast.SkillLevel); pWriter.WriteByte(); pWriter.Write(position); pWriter.Write(CoordF.From(0, 0, 0)); // unk pWriter.Write(rotation); pWriter.Write(CoordF.From(0, 0, 0)); // filler for many 00 pWriter.WriteBool(toggle); pWriter.WriteInt(); pWriter.WriteByte(); return(pWriter); }
public static void UpdatePlayer(GameSession session, SyncState[] syncStates) { Player player = session.Player; IFieldActor <Player> fieldPlayer = player.FieldPlayer; CoordF coord = syncStates[0].Coord.ToFloat(); CoordF coordUnderneath = coord; coordUnderneath.Z -= 50; CoordF blockUnderneath = Block.ClosestBlock(coordUnderneath); if (IsCoordSafe(player, syncStates[0].Coord, blockUnderneath)) { CoordF safeBlock = Block.ClosestBlock(coord); // TODO: Knowing the state of the player using the animation is probably not the correct way to do this // we will need to know the state of the player for other things like counting time spent on ropes/running/walking/swimming if (syncStates[0].Animation2 is 7 or 132) // swimming { safeBlock.Z += Block.BLOCK_SIZE; // Without this player will spawn under the water } safeBlock.Z += 10; // Without this player will spawn inside the block player.SafeBlock = safeBlock; } fieldPlayer.Coord = coord; fieldPlayer.Rotation = new() { Z = syncStates[0].Rotation / 10 }; if (IsOutOfBounds(fieldPlayer.Coord, session.FieldManager.BoundingBox)) { player.Move(player.SafeBlock, fieldPlayer.Rotation); player.FallDamage(); } // not sure if this needs to be synced here fieldPlayer.Animation = syncStates[0].BoreAnimation; }
public static Packet AddBoss(IFieldObject <Mob> mob) { PacketWriter pWriter = PacketWriter.Of(SendOp.FIELD_ADD_NPC); pWriter.WriteInt(mob.ObjectId); pWriter.WriteInt(mob.Value.Id); pWriter.Write(mob.Coord); pWriter.Write(CoordF.From(0, 0, 0)); // Unknown pWriter.WriteMapleString(mob.Value.Model); // StrA - kfm model string // If NPC is not valid, the packet seems to stop here // NPC Stat StatPacket.DefaultStatsMob(pWriter, mob); // NPC Stat pWriter.WriteLong(); pWriter.WriteLong(); pWriter.WriteInt(); pWriter.WriteByte(); int count = 0; pWriter.WriteInt(count); // branch for (int i = 0; i < count; i++) { pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteInt(); pWriter.WriteShort(); pWriter.WriteInt(); pWriter.WriteByte(); pWriter.WriteLong(); } // Unknown pWriter.WriteLong(); pWriter.WriteByte(); pWriter.WriteInt(1); pWriter.WriteInt(); pWriter.WriteByte(); return(pWriter); }
public override void Handle(GameSession session, PacketReader packet) { string entityId = packet.ReadMapleString(); long skillSN = packet.ReadLong(); int skillId = packet.ReadInt(); short skillLevel = packet.ReadShort(); short unkShort = packet.ReadShort(); int unkInt = packet.ReadInt(); CoordF playerCoords = packet.Read <CoordF>(); if (!MapEntityStorage.IsVibrateObject(session.Player.MapId, entityId)) { return; } SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, session.ServerTick); session.FieldManager.BroadcastPacket(VibratePacket.Vibrate(entityId, skillCast, session.FieldPlayer)); }
private static void HandleTypeOfDamage(PacketReader packet) { long skillSN = packet.ReadLong(); packet.ReadByte(); CoordF coords = packet.Read<CoordF>(); CoordF coords2 = packet.Read<CoordF>(); int count = packet.ReadByte(); packet.ReadInt(); for (int i = 0; i < count; i++) { packet.ReadLong(); packet.ReadInt(); packet.ReadByte(); if (packet.ReadBool()) { packet.ReadLong(); } } }
private void HandleAcceptEmote(GameSession session, PacketReader packet) { int buddyEmoteId = packet.ReadInt(); long senderCharacterId = packet.ReadLong(); CoordF senderCoords = packet.Read <CoordF>(); CoordF selfCoords = packet.Read <CoordF>(); int rotation = packet.ReadInt(); Player buddy = GameServer.Storage.GetPlayerById(senderCharacterId); if (buddy == null) { return; } buddy.Session.Send(BuddyEmotePacket.SendAccept(buddyEmoteId, session.Player)); session.Send(BuddyEmotePacket.StartEmote(buddyEmoteId, buddy.Session.Player, session.Player, selfCoords, rotation)); buddy.Session.Send(BuddyEmotePacket.StartEmote(buddyEmoteId, buddy.Session.Player, session.Player, selfCoords, rotation)); }
public override void Handle(GameSession session, PacketReader packet) { string entityId = packet.ReadString(); long skillSN = packet.ReadLong(); int skillId = packet.ReadInt(); short skillLevel = packet.ReadShort(); short unkShort = packet.ReadShort(); int unkInt = packet.ReadInt(); CoordF playerCoords = packet.Read <CoordF>(); Player player = session.Player; if (!MapEntityMetadataStorage.IsVibrateObject(player.MapId, entityId)) { return; } session.FieldManager.BroadcastPacket(VibratePacket.Vibrate(entityId, player.FieldPlayer.SkillCast)); }
// This also leaves decor planning private static void HandleReturnMap(GameSession session) { Player player = session.Player; if (player.IsInDecorPlanner) { player.IsInDecorPlanner = false; player.Guide = null; player.Warp((int)Map.PrivateResidence, instanceId: --player.InstanceId); return; } CoordF returnCoord = player.ReturnCoord; returnCoord.Z += Block.BLOCK_SIZE; player.Warp(player.ReturnMapId, returnCoord, player.Rotation); player.ReturnMapId = 0; player.VisitingHomeId = 0; }
protected override List <MagicPathMetadata> Parse() { List <MagicPathMetadata> magicPathList = new(); foreach (PackFileEntry entry in Resources.XmlReader.Files) { if (!entry.Name.StartsWith("table/magicpath")) { continue; } XmlDocument document = Resources.XmlReader.GetXmlDocument(entry); XmlNodeList pathTypeList = document.SelectNodes("/ms2/type"); foreach (XmlNode pathType in pathTypeList) { long id = long.Parse(pathType.Attributes["id"]?.Value ?? "0"); List <MagicPathMove> pathMoves = new(); XmlNodeList pathMoveList = pathType.SelectNodes("move"); foreach (XmlNode pathMove in pathMoveList) { int rotation = int.Parse(pathMove.Attributes["rotation"]?.Value ?? "0"); CoordF fireOffsetPosition = ParseCoordWithoutLastChar(pathMove.Attributes["fireOffsetPosition"]?.Value ?? "0,0,"); CoordF direction = ParseCoordWithDuplicateDot(pathMove.Attributes["direction"]?.Value ?? "0"); CoordF controlValue0 = ParseCoordFromString(pathMove.Attributes["controlValue0"]?.Value ?? "0,0,0"); CoordF controlValue1 = ParseCoordFromString(pathMove.Attributes["controlValue1"]?.Value ?? "0,0,0"); bool ignoreAdjust = pathMove.Attributes["ignoreAdjustCubePosition"] is null; bool traceTargetOffsetPos = pathMove.Attributes["traceTargetOffsetPos"]?.Value == "1"; float distance = float.Parse(pathMove.Attributes["distance"]?.Value ?? "0"); pathMoves.Add(new(rotation, fireOffsetPosition, direction, controlValue0, controlValue1, ignoreAdjust, traceTargetOffsetPos, distance)); } MagicPathMetadata newMagicPath = new(id, pathMoves); magicPathList.Add(newMagicPath); } } return(magicPathList); }
public override void Execute(GameCommandTrigger trigger) { int mobId = trigger.Get <int>("id"); if (NpcMetadataStorage.GetNpcMetadata(mobId) is null) { trigger.Session.Send(NoticePacket.Notice($"No MOB was found with the id: {mobId.ToString().Color(Color.DarkOliveGreen)}", NoticeType.Chat)); return; } CoordF coord = trigger.Get <CoordF>("coord"); if (coord == default) { coord = trigger.Session.Player.FieldPlayer.Coord; } trigger.Session.FieldManager.RequestMob(mobId, coord, CoordF.From(0.0f, 0.0f, trigger.Get <short>("dir")), trigger.Get <short>("ani")); }
private static void HandleAoeDamage(GameSession session, PacketReader packet) { List <IFieldObject <Mob> > mobs = new List <IFieldObject <Mob> >(); 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(); for (int i = 0; i < count; i++) { int entity = packet.ReadInt(); mobs.Add(session.FieldManager.State.Mobs.GetValueOrDefault(entity)); packet.ReadByte(); if (mobs[i] != null) { mobs[i].Value.UpdateStats(session.FieldPlayer.Value.SkillCast.GetDamage()); session.Send(StatPacket.UpdateMobStats(mobs[i])); // TODO: There needs to be a more centralized way to give rewards from killing mobs... // TODO: Add trophy, exp, meso and item drops if (mobs[i].Value.IsDead) { QuestHelper.UpdateQuest(session, mobs[i].Value.Id.ToString(), "npc"); } if (mobs[i].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()); } } } session.Send(SkillDamagePacket.ApplyDamage(session.FieldPlayer, skillSN, unkValue, coords, mobs)); }
private static void HandleCatch(GameSession session, PacketReader packet) { bool success = packet.ReadBool(); CoordF guideBlock = Block.ClosestBlock(session.Player.Guide.Coord); guideBlock.Z -= Block.BLOCK_SIZE; // get liquid block coord MapBlock block = MapMetadataStorage.GetMapBlock(session.Player.MapId, guideBlock.ToShort()); List <FishMetadata> fishes = FishMetadataStorage.GetValidFishes(session.Player.MapId, block.Attribute); //determine fish rarity List <FishMetadata> selectedFishRarities = FilterFishesByRarity(fishes); Random rnd = RandomProvider.Get(); int randomFishIndex = rnd.Next(selectedFishRarities.Count); FishMetadata fish = selectedFishRarities[randomFishIndex]; //determine fish size int fishSize = rnd.NextDouble() switch {
private static MapBlock ScanZAxisForLiquidBlock(CoordF checkBlock, int mapId) { for (int zAxis = 0; zAxis < 3; zAxis++) { if (MapMetadataStorage.BlockAboveExists(mapId, checkBlock.ToShort())) { return(null); } MapBlock block = MapMetadataStorage.GetMapBlock(mapId, checkBlock.ToShort()); if (block == null || !IsLiquidBlock(block)) { checkBlock.Z -= Block.BLOCK_SIZE; continue; } return(block); } return(null); }
public static Packet SkillUse(SkillCast skillCast, CoordF position, CoordF direction, CoordF rotation, int entityId) { SkillCastMap[skillCast.SkillSN] = skillCast; PacketWriter pWriter = PacketWriter.Of(SendOp.SKILL_USE); pWriter.WriteLong(skillCast.SkillSN); pWriter.WriteInt(skillCast.ServerTick); pWriter.WriteInt(entityId); pWriter.WriteInt(skillCast.SkillId); pWriter.WriteShort(skillCast.SkillLevel); pWriter.WriteByte(); pWriter.Write(position.ToShort()); pWriter.Write(direction); pWriter.Write(rotation); // rotation pWriter.WriteShort(); pWriter.WriteByte(); pWriter.WriteByte(); return(pWriter); }
public void CenterOn(CoordF c) { var wc = TileToWorld(c); ViewOffset = new CoordF(wc.X - ViewSize.Width/2.0f, wc.Y - ViewSize.Height/2.0f); }
public CoordF TileToScreen(CoordF tilePos) { var c = TileToWorld(tilePos); return new CoordF(c.X - ViewOffset.X - TileWidth / 2, c.Y - ViewOffset.Y); }