Ejemplo n.º 1
0
        /// <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();
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 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);
     }
 }
Ejemplo n.º 6
0
        /// <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);
                }
            }
        }
Ejemplo n.º 8
0
        /// <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();
                }
            }
        }