/// <summary> /// Iterates through the provided effect dictionary and sets every stat provided /// </summary> public void setTempStats() { //This calculates a correct percentage of max health to increase if (effectedList.ContainsKey("maxhealthExtraPoints")) { effectedList["maxhealthExtraPoints"] = (14f + effectedEntity.Stats.GetBlended("maxhealthExtraPoints")) * effectedList["maxhealthExtraPoints"]; } foreach (KeyValuePair <string, float> stat in effectedList) { switch (stat.Key) { case "glow": effectedEntity.WatchedAttributes.SetBool("glow", true); break; case "recall": break; case "duration": break; default: effectedEntity.Stats.Set(stat.Key, "potionmod", stat.Value, false); break; } } //This is required everytime max health is changes if (effectedList.ContainsKey("maxhealthExtraPoints")) { EntityBehaviorHealth ebh = effectedEntity.GetBehavior <EntityBehaviorHealth>(); ebh.MarkDirty(); } }
public void reset(EntityPlayer entity, bool message) { foreach (var stats in entity.Stats) { entity.Stats.Remove(stats.Key, "potionmod"); } EntityBehaviorHealth ebh = entity.GetBehavior <EntityBehaviorHealth>(); ebh.MarkDirty(); if (entity.WatchedAttributes.HasAttribute("glow")) { entity.WatchedAttributes.RemoveAttribute("glow"); } if (entity.WatchedAttributes.HasAttribute("potionid")) { long effectIdGametick = entity.WatchedAttributes.GetLong("potionid"); entity.World.UnregisterGameTickListener(effectIdGametick); effectDuration = 0; effectHealth = 0; effectTickSec = 0; entity.WatchedAttributes.RemoveAttribute("potionid"); } if (message) { IServerPlayer player = (entity.World.PlayerByUid((entity as EntityPlayer).PlayerUID) as IServerPlayer); player.SendMessage(GlobalConstants.InfoLogChatGroup, "You feel the effects of the potion disapate", EnumChatType.Notification); } }
public override bool ShouldExecute() { if (cooldownUntilMs > entity.World.ElapsedMilliseconds || failureTime > entity.World.ElapsedMilliseconds) { return(false); } prog = entity.GetBehavior <EntityBehaviorProgram>(); if (prog == null || prog.dormant || !prog.CheckArea()) { return(false); } entityUtil.WalkEntities((prog.workArea.Start + prog.workArea.End) / 2, prog.workArea.Length + prog.workArea.Height + prog.workArea.Width, (ent) => { if (!prog.workArea.ContainsOrTouches(ent.ServerPos.XYZ) || ent.GetBehavior <EntityBehaviorProgram>() == null) { return(true); } EntityBehaviorHealth bh = ent.GetBehavior <EntityBehaviorHealth>(); if (bh == null || bh.Health >= bh.MaxHealth) { return(true); } targetEntity = ent; return(false); }); return(targetEntity != null); }
private void OnPlayerJoin(IServerPlayer playerJ) { var player = playerJ; var entity = player.Entity; Sapi.Event.RegisterCallback((float dt) => { EntityBehaviorHealth health = (EntityBehaviorHealth)entity.GetBehavior("health"); OnDamagedDelegate previousDelegate = health.onDamaged; health.onDamaged = (float damage, DamageSource source) => { float previousDamage = previousDelegate(damage, source); var allomancy = (EntityBehaviorAllomancy)entity.GetBehavior("allomancy"); return(allomancy.OnDamageAfterArmor(previousDamage, source)); }; }, 100); }
private void OnEntitySpawn(Entity spawnedEntity) { if (spawnedEntity.HasBehavior("health")) { var entity = spawnedEntity; Sapi.Event.RegisterCallback((float dt) => { EntityBehaviorHealth health = (EntityBehaviorHealth)entity.GetBehavior("health"); OnDamagedDelegate previousDelegate = health.onDamaged; health.onDamaged = (float damage, DamageSource source) => { float previousDamage = OnGeneralEntityDamaged(entity, damage, source); return(previousDelegate(previousDamage, source)); }; }, 100); } }
/// <summary> Called when the entity has received damage, but after armor damage reduction was applied </summary> public float OnDamageAfterArmor(float damage, DamageSource source) { float newDamage = damage; int effectivePewterBurnStatus = Helper.GetEffectiveBurnStatus("pewter"); if (effectivePewterBurnStatus > 0 && source.Type != EnumDamageType.Heal) { float reductionAmount = (1f / 5.0f * effectivePewterBurnStatus); float reducedDamage = damage * reductionAmount; newDamage -= reducedDamage; Helper.IncreasePewterFatigue(reducedDamage * 2); Helper.IncrementMetalReserve("pewter", -reducedDamage / 4); } EntityBehaviorHealth health = (EntityBehaviorHealth)entity.GetBehavior("health"); if (newDamage > health.Health) { if (Helper.GetPower("pewter") && source.Type != EnumDamageType.Heal) { if (Helper.GetMetalReserve("pewter") > 0) { Helper.SetBurnToggle("pewter", true); Helper.IncrementBurnStatus("pewter", 1); Helper.IncreasePewterFatigue(newDamage * Helper.GetEffectiveBurnStatus("pewter")); Helper.IncrementMetalReserve("pewter", -newDamage); if (Helper.GetMetalReserve("pewter") != 0) { newDamage = health.Health / 2; } } } } if (source.SourceEntity != null) { if (source.SourceEntity.HasBehavior("allomancy")) { EntityBehaviorAllomancy enemyAllomancy = (EntityBehaviorAllomancy)source.SourceEntity.GetBehavior("allomancy"); int effectiveEnemyChromiumBurnStatus = enemyAllomancy.Helper.GetEffectiveBurnStatus("chromium"); if (effectiveEnemyChromiumBurnStatus > 0) { Helper.ClearAllReserves(); } } } return(newDamage); }
public override void OnInteract(EntityAgent byEntity, ItemSlot itemslot, Vec3d hitPosition, EnumInteractMode mode, ref EnumHandling handled) { base.OnInteract(byEntity, itemslot, hitPosition, mode, ref handled); IPlayer byPlayer = byEntity.World.PlayerByUid((byEntity as EntityPlayer).PlayerUID); if (owner != null && owner != byPlayer) { return; } if (mode == EnumInteractMode.Interact) { if (byEntity.Controls.Sneak && byEntity.Controls.Sprint && !invLocked) { workInv[0].TryFlipWith(itemslot); return; } if (itemslot.Itemstack?.Collectible is ItemHammer) { if (entity.GetBehavior <EntityBehaviorHealth>()?.Health < entity.GetBehavior <EntityBehaviorHealth>()?.MaxHealth) { itemslot.Itemstack.Collectible.DamageItem(entity.World, byEntity, itemslot, 5); entity.World.PlaySoundAt(new AssetLocation("game:sounds/effect/anvilhit3.ogg"), entity, byPlayer); entity.ReceiveDamage(new DamageSource() { Type = EnumDamageType.Heal }, 1); return; } } if (byEntity.Controls.Sprint && !restricted && itemslot?.Itemstack?.Collectible is ItemProgCard) { ItemStack stack = itemslot.Itemstack.Attributes.GetItemstack("workStack"); if (stack == null) { return; } stack.ResolveBlockOrItem(entity.World); if (stack != null) { workInv.DropAll(entity.ServerPos.XYZ); workStack = stack; maintree.SetItemstack("workStack", workStack); (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-itemprogram"), EnumChatType.Notification); } return; } else if (byEntity.Controls.Sprint && itemslot.Empty && byPlayer != null && workArea != null) { BlockPos min = workArea.Start.AsBlockPos; BlockPos max = workArea.End.AsBlockPos; max.Y += 1; List <BlockPos> blocks = new List <BlockPos>() { min, max }; List <int> colors = new List <int>() { ColorUtil.ColorFromRgba(215, 94, 94, 64), ColorUtil.ColorFromRgba(215, 94, 94, 64) }; entity.Api.World.HighlightBlocks(byPlayer, 56, blocks, colors, EnumHighlightBlocksMode.Absolute, EnumHighlightShape.Cube); entity.Api.World.RegisterCallback((dt) => entity.Api.World.HighlightBlocks(byPlayer, 56, new List <BlockPos>(), new List <int>()), 3000); } if (byEntity.Controls.Sneak && itemslot?.Itemstack?.Collectible is ItemProgCard) { ITreeAttribute area = itemslot.Itemstack.Attributes.GetTreeAttribute("workArea"); ITreeAttribute box = null; ITreeAttribute barrel = null; if (!nochest) { box = itemslot.Itemstack.Attributes.GetTreeAttribute("workChest"); } if (!nobarrel) { barrel = itemslot.Itemstack.Attributes.GetTreeAttribute("workBarrel"); } StopAll(); if (area != null) { maintree["workArea"] = area.Clone(); workArea = cuboiddFromTree(area); } if (box != null) { maintree["workChest"] = box.Clone(); workChest = new BlockPos(box.GetInt("x"), box.GetInt("y"), box.GetInt("z")); } if (barrel != null) { maintree["workBarrel"] = barrel.Clone(); workBarrel = new BlockPos(barrel.GetInt("x"), barrel.GetInt("y"), barrel.GetInt("z")); } if (area != null || box != null || barrel != null) { (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-program"), EnumChatType.Notification); } } else if (byEntity.Controls.Sneak && itemslot.Empty) { AssetLocation item = new AssetLocation(entity.Code.Domain, "deploybot-" + entity.Code.Path); if (item != null) { EntityBehaviorHealth bh = entity.GetBehavior <EntityBehaviorHealth>(); ItemStack stack = new ItemStack(entity.World.GetItem(item)); stack.Attributes.SetInt("workEnergy", energy); if (bh != null) { stack.Attributes.SetFloat("workHealth", bh.MaxHealth - bh.Health); } byEntity.World.SpawnItemEntity(stack, entity.SidedPos.XYZ); workInv.DropAll(entity.ServerPos.XYZ); entity.Die(EnumDespawnReason.Removed); } } else if (byEntity.Controls.Sneak && itemslot?.Itemstack?.Collectible?.CombustibleProps?.BurnDuration != null) { if (itemslot.Itemstack.Collectible.CombustibleProps.BurnTemperature >= 200) { AddEnergy((itemslot.Itemstack.Collectible.CombustibleProps.BurnTemperature / 100) * (int)itemslot.Itemstack.Collectible.CombustibleProps.BurnDuration); itemslot.TakeOut(1); entity.World.PlaySoundAt(new AssetLocation("game:sounds/effect/extinguish2.ogg"), entity, byPlayer); } } } else { if (byEntity.Controls.Sneak) { StopAll(); workStack = null; workInv.DropAll(entity.ServerPos.XYZ); RemoveArea(); RemoveBarrel(); RemoveChest(); (byPlayer as IServerPlayer)?.SendMessage(GlobalConstants.InfoLogChatGroup, Lang.Get("temporalhack:work-memoryloss"), EnumChatType.Notification); } } }
/// <summary> Try to execute an allomantic effect from this entity </summary> public void TryExecuteActiveAllomanticEffect(string power, int strength, bool flare) { //Console.WriteLine(GetPower(power) + " " + GetMetalReserve(power)); if (!Helper.GetPower(power)) { return; } if (Helper.GetMetalReserve(power) <= 0) { return; } float consumption = ((float)strength / 100); if (flare) { consumption += 1 / 50; } Helper.IncrementMetalReserve(power, -consumption); if (power == "aluminium") { Helper.ClearAllReserves(); } EntityBehaviorHealth health = (EntityBehaviorHealth)entity.GetBehavior("health"); if (power == "pewter") { if (health.Health < health.MaxHealth) { float divider = 50; float magnitude = strength / divider; if (flare) { magnitude = 2; } entity.ReceiveDamage(new DamageSource() { Source = EnumDamageSource.Internal, Type = EnumDamageType.Heal }, magnitude); Helper.IncreasePewterFatigue(magnitude); Helper.IncrementMetalReserve("pewter", -magnitude / 2); } } if (power == "steel" | power == "iron") { if (keyTick % 15 == 0 | flare) { float divider = 23; float magnitude = strength / divider; if (flare) { magnitude += 2 / 10; } float forwardpitch = GameMath.PI - entity.ServerPos.Pitch + GameMath.PI; float forwardyaw = entity.ServerPos.Yaw + GameMath.PIHALF; float inversepitch = GameMath.PI - entity.ServerPos.Pitch + GameMath.PI; float inverseyaw = entity.ServerPos.Yaw + GameMath.PIHALF + GameMath.PI; float playerpitch = power == "steel" ? forwardpitch : inversepitch; float playeryaw = power == "steel" ? forwardyaw : inverseyaw; float targetpitch = power == "steel" ? inversepitch : forwardpitch; float targetyaw = power == "steel" ? inverseyaw : forwardyaw; entity.ServerPos.Motion.Add( (GameMath.Sin(playeryaw) * GameMath.Cos(playerpitch)) * magnitude, (GameMath.Sin(playerpitch)) * magnitude, (GameMath.Cos(playeryaw) * GameMath.Cos(playerpitch)) * magnitude); ((IServerPlayer)entity.World.PlayerByUid(((EntityPlayer)entity).PlayerUID)).SendPositionToClient(); } } }