public override void Init()
{
damageMultiplier = new DamageMultiplier(entityProperties);
WeaponJoint = entity.transform.FindInChilds("WristRight");
if (entityProperties.Values.ContainsKey("MaxDistance"))
{
range = StringParsers.ParseFloat(entityProperties.Values["MaxDistance"]);
}
spreadHorizontal = new Vector2(-1f, 1f);
spreadVertical = new Vector2(-1f, 1f);
if (entityProperties.Values.ContainsKey("RaySpread"))
{
float num = StringParsers.ParseFloat(entityProperties.Values["RaySpread"]);
num *= 0.5f;
spreadHorizontal = new Vector2(0f - num, num);
spreadVertical = new Vector2(0f - num, num);
}
if (entityProperties.Values.ContainsKey("RayCount"))
{
RayCount = int.Parse(entityProperties.Values["RayCount"]);
}
if (entityProperties.Values.ContainsKey("BurstRoundCount"))
{
burstRoundCountMax = int.Parse(entityProperties.Values["BurstRoundCount"]);
}
if (entityProperties.Values.ContainsKey("BurstFireRate"))
{
burstFireRate = Mathf.Max(StringParsers.ParseFloat(entityProperties.Values["BurstFireRate"]), 0.1f);
}
actionTime = burstFireRate * (float)burstRoundCountMax;
if (entityProperties.Values.ContainsKey("CooldownTime"))
{
cooldown = StringParsers.ParseFloat(entityProperties.Values["CooldownTime"]);
}
if (entityProperties.Values.ContainsKey("EntityDamage"))
{
entityDamage = int.Parse(entityProperties.Values["EntityDamage"]);
}
buffActions = new List<string>();
if (entityProperties.Values.ContainsKey("Buff"))
{
string[] collection = entityProperties.Values["Buff"].Replace(" ", "").Split(',', StringSplitOptions.None);
buffActions.AddRange(collection);
}
}
可以看到无人机的机枪是有其他武器的一系列属性的
public void _fireWeapon()
{
EntityDrone entityDrone = entity as EntityDrone;
Vector3 position = WeaponJoint.transform.position;
Vector3 vector = target.getChestPosition() - Origin.position;
EntityAlive entityAlive = GameManager.Instance.World.GetEntity(entityDrone.belongsPlayerId) as EntityAlive;
GameRandom gameRandom = GameManager.Instance.World.GetGameRandom();
_ = entityDrone.OriginalItemValue.ItemClass.ItemTags;
int num = (int)EffectManager.GetValue(PassiveEffects.RoundRayCount, entityDrone.OriginalItemValue, RayCount, entityAlive, null, entityDrone.OriginalItemValue.ItemClass.ItemTags, calcEquipment: true, calcHoldingItem: false);
float value = EffectManager.GetValue(PassiveEffects.MaxRange, entityDrone.OriginalItemValue, range, entityAlive, null, entityDrone.OriginalItemValue.ItemClass.ItemTags, calcEquipment: true, calcHoldingItem: false);
for (int i = 0; i < num; i++)
{
Vector3 normalized = (vector - position).normalized;
normalized = Quaternion.Euler(gameRandom.RandomRange(spreadHorizontal.x, spreadHorizontal.y), gameRandom.RandomRange(spreadVertical.x, spreadVertical.y), 0f) * normalized;
Ray ray = new Ray(position + Origin.position, normalized);
int num2 = Mathf.FloorToInt(EffectManager.GetValue(PassiveEffects.EntityPenetrationCount, entityDrone.OriginalItemValue, 0f, entityAlive, null, entityDrone.OriginalItemValue.ItemClass.ItemTags, calcEquipment: true, calcHoldingItem: false));
num2++;
int num3 = Mathf.FloorToInt(EffectManager.GetValue(PassiveEffects.BlockPenetrationFactor, entityDrone.OriginalItemValue, 1f, entityAlive, null, entityDrone.OriginalItemValue.ItemClass.ItemTags, calcEquipment: true, calcHoldingItem: false));
EntityAlive entityAlive2 = null;
for (int j = 0; j < num2; j++)
{
if (!Voxel.Raycast(GameManager.Instance.World, ray, value, -538751005, 8, 0f))
{
continue;
}
WorldRayHitInfo worldRayHitInfo = Voxel.voxelRayHitInfo.Clone();
if (worldRayHitInfo.tag.StartsWith("E_"))
{
string bodyPartName;
EntityAlive entityAlive3 = ItemActionAttack.FindHitEntityNoTagCheck(worldRayHitInfo, out bodyPartName) as EntityAlive;
if (entityAlive2 == entityAlive3)
{
ray.origin = worldRayHitInfo.hit.pos + ray.direction * 0.1f;
j--;
continue;
}
entityAlive2 = entityAlive3;
}
else
{
j += Mathf.FloorToInt((float)ItemActionAttack.GetBlockHit(GameManager.Instance.World, worldRayHitInfo).Block.MaxDamage / (float)num3);
}
ItemActionAttack.Hit(worldRayHitInfo, entityDrone.belongsPlayerId, EnumDamageTypes.Piercing, GetDamageBlock(entityDrone.OriginalItemValue, BlockValue.Air, GameManager.Instance.World.GetEntity(entityDrone.belongsPlayerId) as EntityAlive, 1), GetDamageEntity(entityDrone.OriginalItemValue, GameManager.Instance.World.GetEntity(entityDrone.belongsPlayerId) as EntityAlive, 1), 1f, entityDrone.OriginalItemValue.PercentUsesLeft, 0f, 0f, "bullet", damageMultiplier, buffActions, new ItemActionAttack.AttackHitInfo(), 1, 0, 0f, null, null, ItemActionAttack.EnumAttackMode.RealNoHarvesting, null, entityDrone.entityId, entityDrone.OriginalItemValue);
}
}
ParticleEffect pe = new ParticleEffect("nozzleflashuzi", WeaponJoint.position + Origin.position, Quaternion.Euler(0f, 180f, 0f), 1f, Color.white, "Electricity/Turret/turret_fire", WeaponJoint);
SpawnParticleEffect(pe, -1);
float lightValue = GameManager.Instance.World.GetLightBrightness(World.worldToBlockPos(entity.position)) / 2f;
ParticleEffect pe2 = new ParticleEffect("nozzlesmokeuzi", WeaponJoint.position + Origin.position, lightValue, new Color(1f, 1f, 1f, 0.3f), null, WeaponJoint, _OLDCreateColliders: false);
SpawnParticleEffect(pe2, -1);
burstRoundCount++;
if ((int)EffectManager.GetValue(PassiveEffects.MagazineSize, entityDrone.OriginalItemValue) > 0)
{
entityDrone.AmmoCount--;
}
entityDrone.OriginalItemValue.UseTimes += EffectManager.GetValue(PassiveEffects.DegradationPerUse, entityDrone.OriginalItemValue, 1f, entityAlive, null, entityDrone.OriginalItemValue.ItemClass.ItemTags, calcEquipment: true, calcHoldingItem: false) * ItemAction.ItemDegradationModifier;
}
开火逻辑里,造成伤害单位还是无人机的所属玩家。










鄂公网安备42011202002543号



兴趣型mod玩家,xml忠实爱好者,只喜欢直连类型xml创作
我的无人机攻击模组在2.6中已经实现了攻击功能,只是没有发布出来。但是,由于我是编程能力有限,适配3.0还有点困难。
3.0的无人机径向菜单好像被硬编码了,还在想办法解决