public override void OnGameTick(float dt) { base.OnGameTick(dt); if (Alive && AnimManager.ActiveAnimationsByAnimCode.Count == 0) { AnimManager.StartAnimation(new AnimationMetaData() { Code = "idle", Animation = "idle", EaseOutSpeed = 10000, EaseInSpeed = 10000 }); } if (World.Side == EnumAppSide.Client) { talkUtil.OnGameTick(dt); } else { if (tickCount++ > 200) { double lastRefreshTotalDays = WatchedAttributes.GetDouble("lastRefreshTotalDays", World.Calendar.TotalDays - 10); int maxRefreshes = 10; while (World.Calendar.TotalDays - lastRefreshTotalDays > doubleRefreshIntervalDays && tradingWith == null && maxRefreshes-- > 0) { int traderAssets = Inventory.GetTraderAssets(); double giveRel = 0.07 + World.Rand.NextDouble() * 0.21; float nowWealth = TradeProps.Money.nextFloat(1f, World.Rand); int toGive = (int)Math.Max(-3, Math.Min(nowWealth, traderAssets + giveRel * (int)nowWealth) - traderAssets); Inventory.GiveToTrader(toGive); RefreshBuyingSellingInventory(0.5f); lastRefreshTotalDays += doubleRefreshIntervalDays; WatchedAttributes.SetDouble("lastRefreshTotalDays", lastRefreshTotalDays); tickCount = 1; } if (maxRefreshes <= 0) { WatchedAttributes.SetDouble("lastRefreshTotalDays", World.Calendar.TotalDays + 1 + World.Rand.NextDouble() * 5); } } } if (tradingWith != null && (tradingWith.Pos.SquareDistanceTo(this.Pos) > 5 || Inventory.openedByPlayerGUIds.Count == 0 || !Alive)) { dlg?.TryClose(); IPlayer tradingPlayer = tradingWith?.Player; if (tradingPlayer != null) { Inventory.Close(tradingPlayer); } } }
public override void OnGameTick(float dt) { base.OnGameTick(dt); if (Alive && AnimManager.ActiveAnimationsByAnimCode.Count == 0) { AnimManager.StartAnimation(new AnimationMetaData() { Code = "idle", Animation = "idle", EaseOutSpeed = 10000, EaseInSpeed = 10000 }); } if (World.Side == EnumAppSide.Client) { talkUtil.OnGameTick(dt); } else { if (tickCount++ % 1000 == 0) { double lastRefreshTotalDays = WatchedAttributes.GetDouble("lastRefreshTotalDays", 0); if (World.Calendar.TotalDays - lastRefreshTotalDays > 14 && tradingWith == null) { RefreshBuyingSellingInventory(0.5f); WatchedAttributes.SetDouble("lastRefreshTotalDays", World.Calendar.TotalDays); tickCount = 1; } } } if (tradingWith != null && (tradingWith.Pos.SquareDistanceTo(this.Pos) > 5 || Inventory.openedByPlayerGUIds.Count == 0)) { dlg?.TryClose(); tradingWith = null; } }
public override void Initialize(EntityProperties properties, ICoreAPI api, long InChunkIndex3d) { base.Initialize(properties, api, InChunkIndex3d); if (api.Side == EnumAppSide.Client) { WatchedAttributes.RegisterModifiedListener("windWaveIntensity", () => { (Properties.Client.Renderer as EntityShapeRenderer).WindWaveIntensity = WatchedAttributes.GetDouble("windWaveIntensity"); }); } ClimateCondition conds = api.World.BlockAccessor.GetClimateAt(Pos.AsBlockPos, EnumGetClimateMode.NowValues); if (conds != null && conds.Temperature < 0) { Die(EnumDespawnReason.Removed); } }
public override void OnReceivedServerAnimations(int[] activeAnimations, int activeAnimationsCount, float[] activeAnimationSpeeds) { // We control glide and fly animations entirely client side if (activeAnimationsCount == 0) { AnimManager.ActiveAnimationsByAnimCode.Clear(); AnimManager.StartAnimation("fly"); } string active = ""; bool found = false; for (int i = 0; i < activeAnimationsCount; i++) { int crc32 = activeAnimations[i]; for (int j = 0; j < Properties.Client.LoadedShape.Animations.Length; j++) { Animation anim = Properties.Client.LoadedShape.Animations[j]; int mask = ~(1 << 31); // Because I fail to get the sign bit transmitted correctly over the network T_T if ((anim.CodeCrc32 & mask) == (crc32 & mask)) { if (AnimManager.ActiveAnimationsByAnimCode.ContainsKey(anim.Code)) { break; } if (anim.Code == "glide" || anim.Code == "fly") { continue; } string code = anim.Code == null?anim.Name.ToLowerInvariant() : anim.Code; active += ", " + code; AnimationMetaData animmeta; Properties.Client.AnimationsByMetaCode.TryGetValue(code, out animmeta); if (animmeta == null) { animmeta = new AnimationMetaData() { Code = code, Animation = code, CodeCrc32 = anim.CodeCrc32 }; } animmeta.AnimationSpeed = activeAnimationSpeeds[i]; AnimManager.ActiveAnimationsByAnimCode[anim.Code] = animmeta; found = true; } } } if (found) { AnimManager.StopAnimation("fly"); AnimManager.StopAnimation("glide"); (Properties.Client.Renderer as EntityShapeRenderer).AddRenderFlags = EnumWindBitModeMask.Bend; (Properties.Client.Renderer as EntityShapeRenderer).WindWaveIntensity = WatchedAttributes.GetDouble("windWaveIntensity"); } else { (Properties.Client.Renderer as EntityShapeRenderer).AddRenderFlags = 0; } }
public override void Initialize(EntityProperties properties, ICoreAPI api, long InChunkIndex3d) { base.Initialize(properties, api, InChunkIndex3d); if (api.Side == EnumAppSide.Client) { WatchedAttributes.RegisterModifiedListener("sitHeight", () => { (Properties.Client.Renderer as EntityShapeRenderer).WindWaveIntensity = WatchedAttributes.GetDouble("sitHeight"); }); } }
public double NextRefreshTotalDays() { double lastRefreshTotalDays = WatchedAttributes.GetDouble("lastRefreshTotalDays", World.Calendar.TotalDays - 10); return(doubleRefreshIntervalDays - (World.Calendar.TotalDays - lastRefreshTotalDays)); }