RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
CutsceneActivity.java
1package com.osroyale.content.activity.impl.cutscene;
2
3import com.osroyale.content.activity.Activity;
4import com.osroyale.content.activity.ActivityType;
5import com.osroyale.game.world.World;
6import com.osroyale.game.world.entity.mob.Mob;
7import com.osroyale.game.world.entity.mob.npc.Npc;
8import com.osroyale.game.world.entity.mob.player.Player;
9import com.osroyale.game.world.position.Position;
10import com.osroyale.net.packet.out.SendCameraReset;
11import com.osroyale.net.packet.out.SendCameraTurn;
12import com.osroyale.net.packet.out.SendMinimapState;
13import com.osroyale.net.packet.out.SendScreenFade;
14import com.osroyale.net.packet.out.CameraViewPacket;
15import com.osroyale.net.packet.context.CameraContext;
16import com.osroyale.net.packet.context.CameraContext.CameraType;
17
18import java.util.ArrayList;
19import java.util.List;
20
54
55public abstract class CutsceneActivity extends Activity {
56
57 protected static final int[] HIDDEN_TABS = new int[] { 0, 1, 2, 3, 4, 5, 6, 11, 12 };
58
59 protected final List<Npc> npcs = new ArrayList<>();
60
61 private final boolean fadeIn;
62
63 protected Position originalPosition;
64
65 protected Player player;
66
67 private int fadeStage = 0;
68
69 public CutsceneActivity(Player player, int cooldown, boolean fadeIn) {
70 super(cooldown, Mob.DEFAULT_INSTANCE);
71 this.player = player;
72 this.fadeIn = fadeIn;
73 }
74
75 public CutsceneActivity(Player player, int cooldown) {
76 this(player, cooldown, true);
77 }
78
79 @Override
80 protected void start() {
81 if (player == null) {
82 return;
83 }
84
85 originalPosition = player.getPosition().copy();
86 player.locking.lock();
87
88 if (fadeIn) {
89 executeStartSequence();
90 } else {
91 immediateStart();
92 }
93 }
94
95 private void executeStartSequence() {
96 fadeStage = 0;
97 World.schedule(1, () -> handleFadeIn());
98 }
99
100 private void handleFadeIn() {
101 switch (fadeStage++) {
102 case 0:
103 // Skip fade for now - directly setup cutscene
104 setupCutscene();
105 World.schedule(1, this::handleFadeIn);
106 break;
107 case 1:
108 onFadeIn();
109 break;
110 }
111 }
112
113 private void immediateStart() {
114 setupCutscene();
115 onFadeIn();
116 }
117
118 private void setupCutscene() {
119 player.send(new SendMinimapState(SendMinimapState.MinimapState.HIDDEN));
120 hideTabs();
121 player.move(getStartPosition());
122 player.movement.reset();
123 player.interfaceManager.close();
124 }
125
126 @Override
127 public void finish() {
128 cleanup();
129
130 if (fadeIn) {
131 executeEndSequence();
132 } else {
133 immediateEnd();
134 }
135 }
136
137 private void executeEndSequence() {
138 fadeStage = 0;
139 World.schedule(1, () -> handleFadeOut());
140 }
141
142 private void handleFadeOut() {
143 switch (fadeStage++) {
144 case 0:
145 restorePlayer();
146 World.schedule(1, this::handleFadeOut);
147 break;
148 case 1:
149 onFadeOut();
150 remove(player);
151 break;
152 }
153 }
154
155 private void immediateEnd() {
156 restorePlayer();
157 onFadeOut();
158 remove(player);
159 }
160
161 private void restorePlayer() {
162 if (originalPosition != null) {
163 player.move(originalPosition);
164 }
165 player.send(new SendMinimapState(SendMinimapState.MinimapState.NORMAL));
166 restoreTabs();
167 player.send(new SendCameraReset());
168 player.locking.unlock();
169 player.movement.reset();
170 }
171
172 @Override
173 public void cleanup() {
174 for (Npc npc : npcs) {
175 if (npc != null && npc.isRegistered()) {
176 npc.unregister();
177 }
178 }
179 npcs.clear();
180 }
181
182 protected void spawnNpc(int id, Position position) {
183 Npc npc = new Npc(id, position);
184 add(npc); // This will set the instance properly
185 npcs.add(npc);
186 }
187
188 protected void spawnNpc(int id, int x, int y, int z) {
189 spawnNpc(id, new Position(x, y, z));
190 }
191
192 protected void camera(int x, int y, int xRot, int yRot, int height, int speed) {
193 Position base = getStartPosition();
194 Position loc = new Position(base.getX() + x, base.getY() + y, 0);
195 player.send(new CameraViewPacket(new CameraContext(player, CameraType.POSITION, loc.getX(), loc.getY(), height, speed, 1)));
196 }
197
198 protected void shakeCamera(int intensity, int duration) {
199 // Skip camera shake for now to avoid crashes
200 }
201
202 protected void resetCamera() {
203 player.send(new SendCameraReset());
204 }
205
206 protected void moveCamera(Position position, int height, int speed) {
207 player.send(new CameraViewPacket(new CameraContext(player, CameraType.POSITION, position.getX(), position.getY(), height, speed, 1)));
208 }
209
210 protected void hideTabs() {
211 for (int tab : getHiddenTabs()) {
212 player.interfaceManager.setSidebar(tab, -1);
213 }
214 }
215
216 protected void restoreTabs() {
217 player.playerAssistant.setSidebar(false, false);
218 }
219
220 protected void dialogue(String... messages) {
221 if (messages.length == 0) {
222 return;
223 }
224
225 player.dialogueFactory.sendStatement(messages).execute();
226 }
227
228 protected void playerDialogue(String... messages) {
229 player.dialogueFactory.sendPlayerChat(messages).execute();
230 }
231
232 protected void npcDialogue(int npcId, String... messages) {
233 player.dialogueFactory.sendNpcChat(npcId, messages).execute();
234 }
235
236 @Override
237 public boolean canLogout(Player player) {
238 return false;
239 }
240
241 @Override
242 public ActivityType getType() {
243 return ActivityType.CUTSCENE;
244 }
245
246 protected abstract void onFadeIn();
247
248 protected void onFadeOut() {
249
250 }
251
252 protected abstract Position getStartPosition();
253
254 protected int[] getHiddenTabs() {
255 return HIDDEN_TABS;
256 }
257
258 public static CutsceneActivity create(Player player) {
259 CutsceneActivity activity = createInstance(player);
260 activity.add(player);
261 activity.resetCooldown();
262 return activity;
263 }
264
265 protected static CutsceneActivity createInstance(Player player) {
266 return null; // To be overridden
267 }
268}
Activity(int cooldown, int instance)
Definition Activity.java:92
static void schedule(Task task)
Definition World.java:284
void move(Position position)
Definition Mob.java:377