protected override void OnHandle(IPacket packet, ClientWorldState worldState) { UpdateStaticPacket updatePacket = (UpdateStaticPacket)packet; for (int i = 0; i < updatePacket.Length; i++) { GroundItem staticToUpdate = worldState.GetGroundItem(updatePacket.Id[i]); //(ClientCharacter)worldState.GetCharacter(updatePacket.MobileId); if (staticToUpdate == null && updatePacket.ItemId[i] != ushort.MinValue) { staticToUpdate = new GroundItem(); staticToUpdate.Id = updatePacket.Id[i]; worldState.AddGroundItem(staticToUpdate); } else if (staticToUpdate != null && updatePacket.ItemId[i] == ushort.MinValue) { worldState.RemoveGroundItem(staticToUpdate); continue; } else if (updatePacket.ItemId[i] == ushort.MinValue) { continue; } staticToUpdate.ItemId = updatePacket.ItemId[i]; staticToUpdate.Position = new Point(updatePacket.PositionX[i], updatePacket.PositionY[i]); } }
private void DrawEffects(SpriteBatch spriteBatch, GameTime gameTime, ClientWorldState world) { spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive); //SpriteBatch.Begin(SpriteBlendMode.Additive, SpriteSortMode.Deferred, SaveStateMode.None); for (int y = 0; y < Effects.Count; y++) { ParticleEffect effect = Effects[y]; for (int i = 0; i < effect.ParticleList.Count; i++) { Particle particle = effect.ParticleList[i]; Texture2D textureToDraw = effectTextures[effect.Sprite]; Rectangle sourceRectangle = textureToDraw.Bounds; //particleEffectSheet.GetSourceRectangle(effect.Sprite); Vector2 origin = sourceRectangle.Center.ToVector2(); //new Vector2(sourceRectangle.Width / 2, sourceRectangle.Height / 2); if (effect.WorldPosition) { spriteBatch.Draw(textureToDraw, (centerScreen - (world.PlayerCharacter.DrawPosition.ToVector2() - particle.Position)), sourceRectangle, particle.Color, particle.Rotation, origin, particle.Scale, SpriteEffects.None, 1); } else { spriteBatch.Draw(textureToDraw, particle.Position, sourceRectangle, particle.Color, particle.Rotation, origin, particle.Scale, SpriteEffects.None, 1); } } } spriteBatch.End(); }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { MoveItemServerPacket incomingPacket = (MoveItemServerPacket)packet; ClientCharacter mobileToUpdate = (ClientCharacter)worldState.GetCharacter(incomingPacket.CharacterID); Item item = (Item)worldState.GetItem(incomingPacket.ItemID); if (mobileToUpdate == null) { worldState.MissingCharacters.Add(incomingPacket.CharacterID); } else if (item != null) { if (incomingPacket.MoveToID.HasValue) //(item.Data.IsWorldItem) { ContainerItem moveToContainer = (ContainerItem)worldState.GetItem(incomingPacket.MoveToID.Value); if (!mobileToUpdate.MoveItem(item, moveToContainer)) { //ToDo: Simulation missmatch, Force server Authority } } else if (incomingPacket.MoveToPosition.HasValue) { if (!mobileToUpdate.MoveItem(item, incomingPacket.MoveToPosition.Value)) { //ToDo: Simulation missmatch, Force server Authority } } } }
protected internal void Draw(SpriteBatch spriteBatch, GameTime gameTime, ClientWorldState world) { //if (lightSheet != null) DrawLightMap(spriteBatch, gameTime); //if (particleEffectSheet != null) DrawEffects(spriteBatch, gameTime, world); }
public InventoryScreen(ClientWorldState clientWorldState, ContainerItem parentContainer, ContainerItem baseContainer) //(ClientWorldState clientWorldState) { this.ParentContainer = parentContainer; this.BaseContainer = baseContainer; world = clientWorldState; //this.GroundItems = world.GroundItemsInRange(world.PlayerCharacter.Id); //this.BaseContainer = (BagClientItem)world.PlayerCharacter.Inventory; }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { StatsChangedPacket incomingPacket = (StatsChangedPacket)packet; ClientCharacter mobileToUpdate = (ClientCharacter)worldState.GetCharacter(incomingPacket.MobileId); if (mobileToUpdate == null) { worldState.MissingCharacters.Add(incomingPacket.MobileId); return; } mobileToUpdate.ServerStatsRecived(incomingPacket.Health, incomingPacket.Energy); }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { MoveToPacket incomingPacket = (MoveToPacket)packet; ClientCharacter mobileToUpdate = (ClientCharacter)worldState.GetCharacter(incomingPacket.MobileId); if (mobileToUpdate == null) { worldState.MissingCharacters.Add(incomingPacket.MobileId); return; } mobileToUpdate.ServerMoveToRecived(new Point(incomingPacket.X, incomingPacket.Y)); }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { PerformAbilityPacket incomingPacket = (PerformAbilityPacket)packet; ClientCharacter mobileToUpdate = (ClientCharacter)worldState.GetCharacter(incomingPacket.CharacterId); if (mobileToUpdate == null) { worldState.MissingCharacters.Add(incomingPacket.CharacterId); return; } worldState.PerformAbility(incomingPacket.AbilityUsed, mobileToUpdate); }
private void ExeState(ClientWorldState clientState, long serverTick) { if (!NeedRollBack(clientState)) { return; } Debug.Log($"check失败,需要回滚,当前环境为:{_context.tick.CurrentTick}帧,将回滚到:{serverTick}帧"); RollBackContext(_context, _backGameContext); _context.ReplaceLastTick(serverTick); if (_context.hasGamePlaySystem) { _context.gamePlaySystem.GamePlaySystem.Execute(); } }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { UseItemPacket incomingPacket = (UseItemPacket)packet; ClientCharacter mobileToUpdate = (ClientCharacter)worldState.GetCharacter(incomingPacket.MobileId); Item itemToUse = worldState.GetItem(incomingPacket.ItemId); if (mobileToUpdate == null) { worldState.MissingCharacters.Add(incomingPacket.MobileId); } if (mobileToUpdate != null && itemToUse != null) { if (itemToUse.IsWorldItem) { if (!mobileToUpdate.PickupItem(itemToUse)) { //ToDo: Simulation missmatch, Force server Authority } } else { if (itemToUse.Category == ItemCategory.Consumable) { ConsumableItem itemToConsume = (ConsumableItem)itemToUse; if (!itemToConsume.Use(mobileToUpdate, worldState)) { //ToDo: Simulation missmatch, Force server Authority } } else if (itemToUse.Category == ItemCategory.Armor || itemToUse.Category == ItemCategory.Weapon) { if (!mobileToUpdate.Equip(itemToUse)) { //ToDo: Sim missmatch, force server Auth } } } } }
public GameplayScreen() { Viewport = new Rectangle(0, 0, 1920, 1080); centerScreen = Viewport.Center; CenterScreenVector2 = centerScreen.ToVector2(); world = new ClientWorldState(); world.CharacterAdded += World_CharacterAdded; network = NetworkEngine.Instance; //networkEngine; network.WorldState = world; worldPump = new WorldPump(); worldPump.State = world; effectManager = new EffectManager(); effectManager.UseDayNightCycle = true; effectManager.DayColor = Color.White; effectManager.NightColor = new Color(.2f, .2f, .4f);//Color.DarkBlue; //inventoryScreen = new InventoryScreen(); //inventoryScreen.ItemUsed += InventoryScreen_ItemUsed; //inventoryScreen.Player = world.PlayerCharacter; }
public static ClientWorldState MakeState(GameContext game, List <GameEntity> syncBuffer) { var buffer = new BitBuffer(512); ushort entityCount = 0; var syncGroup = game.GetGroup(GameMatcher.Sync); syncGroup.GetEntities(syncBuffer); foreach (var entity in syncBuffer) { if (!entity.isDestroyed) { entityCount++; PackEntityUtility.Pack(entity, buffer); } } var worldState = new ClientWorldState { EntityCount = entityCount, Buffer = buffer }; return(worldState); }
/// <summary> /// 这里比较的是通过客户端的缓存还原出来的和服务器时间对应的过去状态和当前服务器状态的比较 /// 这里只能确认当前演播环境需不需要回滚,但是并不能得到演播环境应该如何回滚,只有演播环境自己才能做自己的回滚 /// </summary> /// <param name="clientState"></param> /// <returns></returns> private bool NeedRollBack(ClientWorldState clientState) { _tmpGameContext.Reset(); clientState.Buffer.Reset(); UnpackEntityUtility.CreateEntities(_tmpGameContext, clientState.Buffer, clientState.EntityCount); #region Movers var moverMatcher = GameMatcher.Mover; string TakeMoverIdMethod(GameEntity e) { return(e.moverID.value); } if (!SameEntices(moverMatcher, TakeMoverIdMethod, _backGameContext, _tmpGameContext)) { return(true); } #endregion #region Ice var iceMatcher = GameMatcher.Ice; string TakeIceOwnerMethod(GameEntity e) { return(e.ice.Owner); } return(!SameEntices(iceMatcher, TakeIceOwnerMethod, _backGameContext, _tmpGameContext)); #endregion }
public bool LoadContent(ClientWorldState world) { if (!this.CharacterSelected) { worldServerClient.Disconnect(); return(false); } //CharacterData playerCharData = dataContext.GetCharacter(playerSelectableCharacter); IEnumerable <ItemModel> items = dataContext.GetItems(playerSelectableCharacter.MapId); if (items != null) { List <Item> hasContainerItem = new List <Item>(); foreach (ItemModel itemData in items) { Item item = world.CreateItem(itemData); if (item.ContainerId.HasValue) { hasContainerItem.Add(item); } world.AddItem(item); } foreach (Item item in hasContainerItem) { ContainerItem containerItem = (ContainerItem)world.GetItem(item.ContainerId.Value); if (containerItem != null) { containerItem.Items.Add(item); } } } //world.PlayerCharacter = new ClientCharacter(playerCharacterId, playerCharData.WorldLocation); ////world.PlayerCharacter.Id = playerCharacterId; //world.PlayerCharacter.Health = playerCharData.Health; //world.PlayerCharacter.Energy = playerCharData.Energy; //world.PlayerCharacter.InventoryData = dataContext.GetItem(playerCharData.InventoryID); //world.PlayerCharacter.Inventory = (BagClientItem)world.CreateItem(world.PlayerCharacter.InventoryData); //world.AddCharacter(world.PlayerCharacter); //world.AddItem(world.PlayerCharacter.Inventory); IEnumerable <CharacterModel> onlineCharacters = dataContext.GetCharacters(playerSelectableCharacter.MapId); if (onlineCharacters != null) { foreach (CharacterModel charData in onlineCharacters) { ClientCharacter character = world.CreateCharacter(charData); //, dataContext.GetItem(charData.InventoryID)); //new ClientCharacter(charData.CharacterDataID, charData.WorldLocation); ////world.PlayerCharacter.Id = playerCharacterId; //character.Health = playerCharData.Health; //character.Energy = playerCharData.Energy; //character.InventoryData = dataContext.GetItem(charData.InventoryID); //if (character.InventoryData != null) // character.Inventory = (BagClientItem)world.CreateItem(character.InventoryData); if (character.Id == playerSelectableCharacter.CharacterId) { world.PlayerCharacter = character; } if (character != null) { world.AddCharacter(character); } //world.AddItem(character.Inventory); } } if (world.PlayerCharacter == null) { worldServerClient.Disconnect(); return(false); } return(true); }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { ChatMessagePacket recivedPacket = (ChatMessagePacket)packet; worldState.AddChatMessage(recivedPacket.MobileId, recivedPacket.Message); }
//internal NetworkEngine Network { get; set; } protected abstract void OnHandle(IPacket packet, ClientWorldState worldState);
public void Handle(IPacket packet, ClientWorldState worldState) { packet.ReadBuffer(); this.OnHandle(packet, worldState); }
protected override void OnHandle(IPacket packet, ClientWorldState worldState) { ErrorPacket recivedPacket = (ErrorPacket)packet; NetworkEngine.Instance.AddServerError(recivedPacket.Code, recivedPacket.Message); }