-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBirdBossReworkSystem.cs
More file actions
160 lines (145 loc) · 6.99 KB
/
BirdBossReworkSystem.cs
File metadata and controls
160 lines (145 loc) · 6.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using CoreLib.Submodules.ModComponent;
using CoreLib.Submodules.ModSystem;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
using Random = UnityEngine.Random;
namespace PainMod;
public class BirdBossReworkSystem : MonoBehaviour, IPseudoServerSystem, IStateRequester
{
private World serverWorld;
public const string BIRD_BOSS_REWORKED_BEAM_STATE = "PainMod:BirdBossReworkedBeamState";
public static StateID birdBossReworkState = SystemModule.GetModStateId(BIRD_BOSS_REWORKED_BEAM_STATE);
public const string STATE_ID_PING_PONG = "PainMod:BirdPingPongState";
public static StateID birdPingPongState = SystemModule.GetModStateId(STATE_ID_PING_PONG);
private ModComponentDataFromEntity<BirdBossReworkCD> birdModStateGroup;
public void OnServerStarted(World world)
{
serverWorld = world;
}
public void OnServerStopped()
{
serverWorld = null;
}
public void OnCreate(World world)
{
birdModStateGroup = new ModComponentDataFromEntity<BirdBossReworkCD>(world.EntityManager);
}
public bool ShouldUpdate(Entity entity, ref StateRequestData data, ref StateRequestContainers containers)
{
return birdModStateGroup.HasComponent(entity);
}
public bool OnUpdate(Entity entity, EntityCommandBuffer ecb, ref StateRequestData data, ref StateRequestContainers containers,
ref StateInfoCD stateInfo)
{
return false;
}
private bool lastFrameHadFullHealth = true;
private static float range;
private void FixedUpdate()
{
if (serverWorld == null) return;
EntityQuery birdQuery =
Manager.ecs.ServerWorld.EntityManager.CreateEntityQuery(ComponentModule.ReadOnly<BirdBossReworkCD>());
foreach (var ent in birdQuery.ToEntityArray(Allocator.Temp))
{
StateInfoCD stateInfo = serverWorld.EntityManager.GetModComponentData<StateInfoCD>(ent);
BirdBossReworkCD reworkCd = serverWorld.EntityManager.GetModComponentData<BirdBossReworkCD>(ent);
range = reworkCd.radiusToBorder - 1;
HealthCD healthCd = serverWorld.EntityManager.GetModComponentData<HealthCD>(ent);
if (!healthCd.HasFullHealth && lastFrameHadFullHealth)
{
TryDeleteBirdBossBarriers();
CreateBirdBossBarriers(reworkCd);
}
else if(healthCd.HasFullHealth)
TryDeleteBirdBossBarriers();
RunThisEveryUpdate(ent);
if (stateInfo.currentState == StateID.Teleport)
{
TeleportStateCD teleportStateCd = serverWorld.EntityManager.GetModComponentData<TeleportStateCD>(ent);
if (GetDistance(Constants.BirdMarkerPos, teleportStateCd.targetDestination) >
reworkCd.radiusToBorder - 1)
{
teleportStateCd.targetDestination = Constants.BirdMarkerPos + GetRandomInCirclePlace(reworkCd.radiusToBorder-1);
serverWorld.EntityManager.SetModComponentData(ent, teleportStateCd);
}
}
lastFrameHadFullHealth = healthCd.HasFullHealth;
}
EntityQuery stoneQuery = Manager.ecs.ServerWorld.EntityManager.CreateEntityQuery(ComponentModule.ReadOnly<BirdStoneCD>(), ComponentModule.ReadWrite<Translation>());
foreach (var stone in stoneQuery.ToEntityArray(Allocator.Temp))
{
Translation translation = serverWorld.EntityManager.GetModComponentData<Translation>(stone);
if(GetDistance(Constants.BirdMarkerPos, translation.Value) > range)
serverWorld.EntityManager.DestroyEntity(stone);
}
}
private void CreateBirdBossBarriers(BirdBossReworkCD reworkCd)
{
EntityQuery query2 = Manager.ecs.ServerWorld.EntityManager.CreateEntityQuery(ComponentModule.ReadOnly<PugDatabase.DatabaseBankCD>());
BlobAssetReference<PugDatabase.PugDatabaseBank> bank = query2.GetSingleton<PugDatabase.DatabaseBankCD>()
.databaseBankBlob;
EntityCommandBuffer ecb = new EntityCommandBuffer(Allocator.Temp);
float x = 0;
for (int i = 0; i < reworkCd.amountOfShockBarriers; i++)
{
x += 2 * (float)Math.PI / reworkCd.amountOfShockBarriers;
Entity shock = EntityUtility.CreateEntity(ecb, Constants.BirdMarkerPos + new float3(reworkCd.radiusToBorder*(float)Math.Cos(x),0, reworkCd.radiusToBorder*(float)Math.Sin(x))
, Plugin.birdBossBarrier, 1, bank, 0);
ecb.AddModComponent<BirdBarrierCD>(shock);
}
ecb.Playback(serverWorld.EntityManager);
ecb.Dispose();
}
private void RunThisEveryUpdate(Entity owner)
{
EntityQuery barrierQuery = serverWorld.EntityManager.CreateEntityQuery(
ComponentModule.ReadOnly<FactionCD>(),
ComponentModule.ReadOnly<BirdBarrierCD>(),
ComponentModule.ReadOnly<OwnerCD>(),
ComponentModule.ReadWrite<Translation>());
foreach (var barrier in barrierQuery.ToEntityArray(Allocator.Temp))
{
OwnerCD ownerCd = serverWorld.EntityManager.GetModComponentData<OwnerCD>(barrier);
ownerCd.owner = owner;
serverWorld.EntityManager.SetModComponentData(barrier, ownerCd);
//FactionCD factionCd = serverWorld.EntityManager.GetModComponentData<FactionCD>(barrier);
//factionCd.originalFaction = FactionID.AttacksAllButNotAttacked;
//factionCd.faction = FactionID.AttacksAllButNotAttacked;
//serverWorld.EntityManager.SetModComponentData(barrier, factionCd);
AttackContinuouslyCD attackContinuouslyCd =
serverWorld.EntityManager.GetModComponentData<AttackContinuouslyCD>(barrier);
attackContinuouslyCd.ignoreDamageReduction = true;
attackContinuouslyCd.requiresElectricity = false;
attackContinuouslyCd.damage = 900;
serverWorld.EntityManager.SetModComponentData(barrier, attackContinuouslyCd);
EntityUtility.InheritFaction(serverWorld, owner, barrier);
}
}
private void TryDeleteBirdBossBarriers()
{
EntityQuery birdBossBarrierQuery =
Manager.ecs.ServerWorld.EntityManager.CreateEntityQuery(ComponentModule.ReadOnly<BirdBarrierCD>());
foreach (var ent in birdBossBarrierQuery.ToEntityArray(Allocator.Temp))
{
serverWorld.EntityManager.DestroyEntity(ent);
}
}
private float3 GetRandomInCirclePlace(float maxRange)
{
float r1 = Random.value * (float)Math.PI*2;
float r2 = Random.RandomRange(0, maxRange);
return new float3(r2 * (float) Math.Cos(r1), 0, r2 * (float) Math.Sin(r1));
}
private float GetDistance(float3 first, float3 second)
{
double xComp = second.x - first.x;
double yComp = second.y - first.y;
return (float) Math.Sqrt(Math.Pow(xComp, 2) + Math.Pow(yComp, 2));
}
public int priority => SystemModule.HIGHER_PRIORITY;
}