public override void OnHeldInteractStop(float secondsUsed, IItemSlot slot, IEntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel) { if (byEntity.Attributes.GetInt("aiming") == 0) { return; } byEntity.Attributes.SetInt("aiming", 0); byEntity.StopAnimation("aim"); if (secondsUsed < 0.35f) { return; } float damage = 0.5f; string rockType = slot.Itemstack.Collectible.FirstCodePart(1); ItemStack stack = slot.TakeOut(1); slot.MarkDirty(); IPlayer byPlayer = null; if (byEntity is IEntityPlayer) { byPlayer = byEntity.World.PlayerByUid(((IEntityPlayer)byEntity).PlayerUID); } byEntity.World.PlaySoundAt(new AssetLocation("sounds/player/throw"), byEntity, byPlayer, false, 8); EntityProperties type = byEntity.World.GetEntityType(new AssetLocation("thrownbeenade")); Entity entity = byEntity.World.ClassRegistry.CreateEntity(type); ((EntityThrownBeenade)entity).FiredBy = byEntity; ((EntityThrownBeenade)entity).Damage = damage; ((EntityThrownBeenade)entity).ProjectileStack = stack; float acc = (1 - byEntity.Attributes.GetFloat("aimingAccuracy", 0)); double rndpitch = byEntity.WatchedAttributes.GetDouble("aimingRandPitch", 1) * acc * 0.75; double rndyaw = byEntity.WatchedAttributes.GetDouble("aimingRandYaw", 1) * acc * 0.75; Vec3d pos = byEntity.ServerPos.XYZ.Add(0, byEntity.EyeHeight - 0.2, 0); Vec3d aheadPos = pos.AheadCopy(1, byEntity.ServerPos.Pitch + rndpitch, byEntity.ServerPos.Yaw + rndyaw); Vec3d velocity = (aheadPos - pos) * 0.5; entity.ServerPos.SetPos(byEntity.ServerPos.BehindCopy(0.21).XYZ.Add(0, byEntity.EyeHeight - 0.2, 0).Ahead(0.25, 0, byEntity.ServerPos.Yaw + GameMath.PIHALF)); entity.ServerPos.Motion.Set(velocity); entity.Pos.SetFrom(entity.ServerPos); entity.World = byEntity.World; byEntity.World.SpawnEntity(entity); byEntity.StartAnimation("throw"); }
public override bool OnHeldInteractCancel(float secondsUsed, IItemSlot slot, IEntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel, EnumItemUseCancelReason cancelReason) { byEntity.Attributes.SetInt("aiming", 0); byEntity.StopAnimation("aim"); if (cancelReason != EnumItemUseCancelReason.ReleasedMouse) { byEntity.Attributes.SetInt("aimingCancel", 1); } return(true); }
public override bool OnHeldInteractCancel(float secondsUsed, IItemSlot slot, IEntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel, EnumItemUseCancelReason cancelReason) { byEntity.Attributes.SetInt("aiming", 0); byEntity.StopAnimation("bowaim"); if (byEntity.World is IClientWorldAccessor) { slot.Itemstack.TempAttributes.SetInt("renderVariant", 0); } if (cancelReason != EnumItemUseCancelReason.ReleasedMouse) { byEntity.Attributes.SetInt("aimingCancel", 1); } return(true); }
public override void OnHeldInteractStop(float secondsUsed, IItemSlot slot, IEntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel) { if (byEntity.Attributes.GetInt("aimingCancel") == 1) { return; } byEntity.Attributes.SetInt("aiming", 0); byEntity.StopAnimation("aim"); if (secondsUsed < 0.35f) { return; } float damage = 1.5f; if (slot.Itemstack.Collectible.Attributes != null) { damage = slot.Itemstack.Collectible.Attributes["damage"].AsFloat(0); } string spearMaterial = slot.Itemstack.Collectible.FirstCodePart(1); ItemStack stack = slot.TakeOut(1); stack.Collectible.DamageItem(byEntity.World, byEntity, new DummySlot(stack)); IPlayer byPlayer = null; if (byEntity is IEntityPlayer) { byPlayer = byEntity.World.PlayerByUid(((IEntityPlayer)byEntity).PlayerUID); } byEntity.World.PlaySoundAt(new AssetLocation("sounds/player/throw"), byEntity, byPlayer, false, 8); EntityProperties type = byEntity.World.GetEntityType(new AssetLocation(Attributes["spearEntityCode"].AsString())); Entity entity = byEntity.World.ClassRegistry.CreateEntity(type); ((EntityProjectile)entity).FiredBy = byEntity; ((EntityProjectile)entity).Damage = damage; ((EntityProjectile)entity).ProjectileStack = stack; ((EntityProjectile)entity).DropOnImpactChance = 1.1f; ((EntityProjectile)entity).Weight = 0.3f; int?texIndex = type.Attributes?["texturealternateMapping"]?[spearMaterial].AsInt(0); entity.WatchedAttributes.SetInt("textureIndex", texIndex == null ? 0 : (int)texIndex); float acc = (1 - byEntity.Attributes.GetFloat("aimingAccuracy", 0)); double rndpitch = byEntity.WatchedAttributes.GetDouble("aimingRandPitch", 1) * acc * 0.75; double rndyaw = byEntity.WatchedAttributes.GetDouble("aimingRandYaw", 1) * acc * 0.75; Vec3d pos = byEntity.ServerPos.XYZ.Add(0, byEntity.EyeHeight - 0.2, 0); Vec3d aheadPos = pos.AheadCopy(1, byEntity.ServerPos.Pitch + rndpitch, byEntity.ServerPos.Yaw + rndyaw); Vec3d velocity = (aheadPos - pos) * 0.65; entity.ServerPos.SetPos(byEntity.ServerPos.BehindCopy(0.21).XYZ.Add(0, byEntity.EyeHeight - 0.2, 0)); entity.ServerPos.Motion.Set(velocity); entity.Pos.SetFrom(entity.ServerPos); entity.World = byEntity.World; ((EntityProjectile)entity).SetRotation(); byEntity.World.SpawnEntity(entity); byEntity.StartAnimation("throw"); RefillSlotIfEmpty(slot, byEntity); }
public override void OnHeldInteractStop(float secondsUsed, IItemSlot slot, IEntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel) { if (byEntity.Attributes.GetInt("aimingCancel") == 1) { return; } byEntity.Attributes.SetInt("aiming", 0); byEntity.StopAnimation("bowaim"); if (byEntity.World is IClientWorldAccessor) { slot.Itemstack.TempAttributes.SetInt("renderVariant", 0); } if (secondsUsed < 0.35f) { return; } IItemSlot arrowSlot = GetNextArrow(byEntity); if (arrowSlot == null) { return; } string arrowMaterial = arrowSlot.Itemstack.Collectible.FirstCodePart(1); float damage = 0; // Bow damage if (slot.Itemstack.Collectible.Attributes != null) { damage += slot.Itemstack.Collectible.Attributes["damage"].AsFloat(0); } // Arrow damage if (arrowSlot.Itemstack.Collectible.Attributes != null) { damage += arrowSlot.Itemstack.Collectible.Attributes["damage"].AsFloat(0); } ItemStack stack = arrowSlot.TakeOut(1); arrowSlot.MarkDirty(); IPlayer byPlayer = null; if (byEntity is IEntityPlayer) { byPlayer = byEntity.World.PlayerByUid(((IEntityPlayer)byEntity).PlayerUID); } byEntity.World.PlaySoundAt(new AssetLocation("sounds/bow-release"), byEntity, byPlayer, false, 8); EntityProperties type = byEntity.World.GetEntityType(new AssetLocation("arrow")); Entity entity = byEntity.World.ClassRegistry.CreateEntity(type); ((EntityProjectile)entity).FiredBy = byEntity; ((EntityProjectile)entity).Damage = damage; ((EntityProjectile)entity).ProjectileStack = stack; ((EntityProjectile)entity).DropOnImpactChance = (arrowMaterial == "flint") ? 0.5f : 0.65f;; int?texIndex = type.Attributes?["texturealternateMapping"]?[arrowMaterial].AsInt(0); entity.WatchedAttributes.SetInt("textureIndex", texIndex == null ? 0 : (int)texIndex); float acc = (1 - byEntity.Attributes.GetFloat("aimingAccuracy", 0)); double rndpitch = byEntity.WatchedAttributes.GetDouble("aimingRandPitch", 1) * acc * 0.75; double rndyaw = byEntity.WatchedAttributes.GetDouble("aimingRandYaw", 1) * acc * 0.75; Vec3d pos = byEntity.ServerPos.XYZ.Add(0, byEntity.EyeHeight - 0.2, 0); Vec3d aheadPos = pos.AheadCopy(1, byEntity.ServerPos.Pitch + rndpitch, byEntity.ServerPos.Yaw + rndyaw); Vec3d velocity = (aheadPos - pos) * 0.75; entity.ServerPos.SetPos(byEntity.ServerPos.BehindCopy(0.21).XYZ.Add(0, byEntity.EyeHeight - 0.2, 0)); entity.ServerPos.Motion.Set(velocity); entity.Pos.SetFrom(entity.ServerPos); entity.World = byEntity.World; ((EntityProjectile)entity).SetRotation(); byEntity.World.SpawnEntity(entity); slot.Itemstack.Collectible.DamageItem(byEntity.World, byEntity, slot); byEntity.StartAnimation("bowhit"); }