RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
ZulrahPhase.java
1package com.osroyale.content.activity.impl.zulrah;
2
3import com.osroyale.game.Animation;
4import com.osroyale.game.Projectile;
5import com.osroyale.game.UpdatePriority;
6import com.osroyale.game.task.impl.ObjectPlacementEvent;
7import com.osroyale.game.world.World;
8import com.osroyale.game.world.entity.mob.npc.Npc;
9import com.osroyale.game.world.entity.mob.player.Player;
10import com.osroyale.game.world.object.CustomGameObject;
11import com.osroyale.game.world.position.Position;
12import com.osroyale.net.packet.out.SendCameraReset;
13import com.osroyale.net.packet.out.SendMessage;
14import com.osroyale.util.RandomUtils;
15import com.osroyale.util.Utility;
16
17import java.util.concurrent.TimeUnit;
18
47
49 INITIALIZATION() {
50 @Override
51 public void execute(ZulrahActivity activity) {
52 Player player = activity.player;
53 int count = activity.count;
54
55 if (count == 0) {
56 player.send(new SendCameraReset());
57 } else if (count == 1) {
58 activity.zulrah = new Npc(2042, new Position(2266, 3073));
59 activity.add(activity.zulrah);
60 activity.zulrah.definition.setRetaliate(false);
61 activity.zulrah.definition.setAggressive(false);
62 activity.zulrah.canAttack = false;
63 activity.zulrah.blockInteract = true;
64 activity.zulrah.owner = player;
65 activity.zulrah.face(player.getPosition());
66 activity.zulrah.animate(5071);
67 activity.cooldown(1);
68 } else if (count == 2) {
69 activity.zulrah.blockInteract = false;
70 activity.zulrah.resetFace();
71 activity.count = -1;
72 activity.phase = INITIAL_CLOUDS;
73 activity.cooldown(3);
74 return;
75 }
76
77 activity.increment();
78 }
79 },
80 INITIAL_CLOUDS() {
81 @Override
82 public void execute(ZulrahActivity activity) {
83 Npc zulrah = activity.zulrah;
84
85 int index = activity.count / 3;
86 int stage = activity.count % 3;
87
88 if (index >= ZulrahConstants.CLOUD_POSITIONS.length) {
89 activity.count = 0;
90 activity.phase = DIVE;
91 activity.reset();
92 activity.cooldown(2);
93 return;
94 }
95
96 if (stage == 0) {
97 zulrah.face(ZulrahConstants.CLOUD_POSITIONS[index]);
98 } else if (stage == 1) {
99 zulrah.animate(new Animation(5069, UpdatePriority.VERY_HIGH));
100 World.sendProjectile(zulrah, ZulrahConstants.CLOUD_POSITIONS[index], new Projectile(1045, 1, 35, 85, 40));
101 } else if (stage == 2) {
102 CustomGameObject cloud = new CustomGameObject(11700, activity.getInstance(), ZulrahConstants.CLOUD_POSITIONS[index]);
103 World.schedule(new ObjectPlacementEvent(cloud, 35, () -> activity.clouds.remove(cloud)));
104 activity.clouds.add(cloud);
105 }
106
107 activity.increment();
108 }
109 },
110 DIVE() {
111 @Override
112 public void execute(ZulrahActivity activity) {
113 Npc zulrah = activity.zulrah;
114 int count = activity.count;
115
116 if (count == 0) {
117 zulrah.animate(new Animation(5072, UpdatePriority.VERY_HIGH), true);
118 activity.player.send(new SendMessage("Zulrah dives into the swamp..."));
119 } else if (count == 3) {
120 zulrah.setVisible(false);
121 zulrah.transform(activity.nextForm());
122 zulrah.move(RandomUtils.randomExclude(ZulrahConstants.LOCATIONS, zulrah.getPosition()));
123 } else if (count == 5) {
124 zulrah.locking.unlock();
125 zulrah.setVisible(true);
126 zulrah.animate(new Animation(5071, UpdatePriority.VERY_HIGH));
127 activity.count = -1;
128 activity.phase = activity.nextPhase();
129 activity.reset();
130 activity.cooldown(2);
131 return;
132 }
133
134 activity.increment();
135 }
136 },
137 ATTACKING() {
138 @Override
139 public void execute(ZulrahActivity activity) {
140 Npc zulrah = activity.zulrah;
141
142 if (!zulrah.definition.isAggressive() || !zulrah.definition.isRetaliate() || !zulrah.canAttack) {
143 zulrah.definition.setAggressive(true);
144 zulrah.canAttack = true;
145 zulrah.definition.setRetaliate(true);
146 }
147
148 if (activity.stopwatch.elapsedTime(TimeUnit.SECONDS) >= 10 && Utility.random(5) == 0) {
149 activity.reset();
150 activity.phase = DIVE;
151 zulrah.definition.setAggressive(false);
152 activity.zulrah.definition.setRetaliate(false);
153 zulrah.canAttack = false;
154 activity.cooldown(2);
155 return;
156 }
157
158 activity.increment();
159 activity.cooldown(2);
160 }
161 },
162 POISONOUS_CLOUD() {
163 @Override
164 public void execute(ZulrahActivity activity) {
165 Npc zulrah = activity.zulrah;
166
167 if (activity.target == null) {
168 activity.target = activity.getCloudPosition();
169 }
170
171 if (activity.clouds.size() >= ZulrahConstants.MAXIMUM_CLOUDS) {
172 activity.reset();
173 activity.phase = DIVE;
174 activity.cooldown(2);
175 return;
176 }
177
178 int stage = activity.count % 3;
179
180 if (stage == 0) {
181 zulrah.face(activity.target);
182 } else if (stage == 1) {
183 zulrah.animate(new Animation(5069, UpdatePriority.VERY_HIGH));
184 World.sendProjectile(zulrah, activity.target, new Projectile(1045, 1, 35, 85, 40));
185 } else if (stage == 2) {
186 CustomGameObject cloud = new CustomGameObject(11700, activity.getInstance(), activity.target);
187 activity.clouds.add(cloud);
188 World.schedule(new ObjectPlacementEvent(cloud, 150, () -> activity.clouds.remove(cloud)));
189 activity.target = null;
190 }
191
192 activity.increment();
193 activity.cooldown(1);
194 }
195 },
196 SNAKELINGS() {
197 @Override
198 public void execute(ZulrahActivity activity) {
199 Npc zulrah = activity.zulrah;
200
201 if (activity.target == null) {
202 activity.target = activity.getSnakelingPosition();
203 }
204
205 if (activity.snakes.size() >= ZulrahConstants.MAXIMUM_SNAKELINGS) {
206 activity.reset();
207 activity.phase = DIVE;
208 activity.cooldown(2);
209 return;
210 }
211
212 int stage = activity.count % 3;
213
214 if (stage == 0) {
215 zulrah.face(activity.target);
216 } else if (stage == 1) {
217 zulrah.animate(new Animation(5068, UpdatePriority.VERY_HIGH));
218 World.sendProjectile(zulrah, activity.target, new Projectile(1047, 1, 35, 85, 40));
219 } else if (stage == 2) {
220 Npc snake = new Npc(2045, activity.target);
221 activity.add(snake);
222 snake.getCombat().attack(activity.player);
223 activity.snakes.add(snake);
224 activity.target = null;
225 }
226
227 activity.increment();
228 activity.cooldown(1);
229 }
230 },
231}
static void schedule(Task task)
Definition World.java:284
static void sendProjectile(Projectile projectile, Position position, int instance, int lock, byte offsetX, byte offsetY)
Definition World.java:332
void face(GameObject object)
Definition Mob.java:326