summaryrefslogtreecommitdiffstats
path: root/src/Bindings/Plugin.h
blob: 2e2d028f10407d4eb36d4359421cacfe24627bd0 (plain) (blame)
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335

// Plugin.h

// Declares the cPlugin class representing an interface that a plugin implementation needs to expose, with some helping
// functions





#pragma once

#include "../Defines.h"
#include "PluginManager.h"




// tolua_begin
class cPlugin
{
  public:
	// tolua_end

	/** Creates a new instance.
	a_FolderName is the name of the folder (in the Plugins folder) from which the plugin is loaded.
	The plugin's name defaults to the folder name. */
	cPlugin(const AString & a_FolderName);

	virtual ~cPlugin();

	/** Called as the last call into the plugin before it is unloaded. */
	virtual void OnDisable(void) {}

	/** Loads and initializes the plugin. Sets m_Status to psLoaded or psError accordingly.
	Returns true if the initialization succeeded, false otherwise. */
	virtual bool Load(void) = 0;

	/** Unloads the plugin. Sets m_Status to psDisabled.
	The default implementation removes the plugin's associations with cPluginManager, descendants should call it as
	well. */
	virtual void Unload(void);

	// Called each tick
	virtual void Tick(float a_Dt) = 0;

	/** Calls the specified hook with the params given. Returns the bool that the hook callback returns. */
	virtual bool OnBlockSpread(cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;
	virtual bool OnBlockToPickups(
		cWorld & a_World,
		Vector3i a_BlockPos,
		BLOCKTYPE a_BlockType,
		NIBBLETYPE a_BlockMeta,
		const cBlockEntity * a_BlockEntity,
		const cEntity * a_Digger,
		const cItem * a_Tool,
		cItems & a_Pickups
	) = 0;
	virtual bool OnBrewingCompleting(cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) = 0;
	virtual bool OnBrewingCompleted(cWorld & a_World, cBrewingstandEntity & a_BrewingstandEntity) = 0;
	virtual bool OnChat(cPlayer & a_Player, AString & a_Message) = 0;
	virtual bool OnChunkAvailable(cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;
	virtual bool OnChunkGenerated(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) = 0;
	virtual bool OnChunkGenerating(cWorld & a_World, int a_ChunkX, int a_ChunkZ, cChunkDesc * a_ChunkDesc) = 0;
	virtual bool OnChunkUnloaded(cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;
	virtual bool OnChunkUnloading(cWorld & a_World, int a_ChunkX, int a_ChunkZ) = 0;
	virtual bool OnCollectingPickup(cPlayer & a_Player, cPickup & a_Pickup) = 0;
	virtual bool OnCraftingNoRecipe(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;
	virtual bool OnDisconnect(cClientHandle & a_Client, const AString & a_Reason) = 0;
	virtual bool OnEntityAddEffect(
		cEntity & a_Entity,
		int a_EffectType,
		int a_EffectDurationTicks,
		int a_EffectIntensity,
		double a_DistanceModifier
	) = 0;
	virtual bool OnEntityTeleport(
		cEntity & a_Entity,
		const Vector3d & a_OldPosition,
		const Vector3d & a_NewPosition
	) = 0;
	virtual bool OnEntityChangingWorld(cEntity & a_Entity, cWorld & a_World) = 0;
	virtual bool OnEntityChangedWorld(cEntity & a_Entity, cWorld & a_World) = 0;
	virtual bool OnExecuteCommand(
		cPlayer * a_Player,
		const AStringVector & a_Split,
		const AString & a_EntireCommand,
		cPluginManager::CommandResult & a_Result
	) = 0;
	virtual bool OnExploded(
		cWorld & a_World,
		double a_ExplosionSize,
		bool a_CanCauseFire,
		double a_X,
		double a_Y,
		double a_Z,
		eExplosionSource a_Source,
		void * a_SourceData
	) = 0;
	virtual bool OnExploding(
		cWorld & a_World,
		double & a_ExplosionSize,
		bool & a_CanCauseFire,
		double a_X,
		double a_Y,
		double a_Z,
		eExplosionSource a_Source,
		void * a_SourceData
	) = 0;
	virtual bool OnHandshake(cClientHandle & a_Client, const AString & a_Username) = 0;
	virtual bool OnHopperPullingItem(
		cWorld & a_World,
		cHopperEntity & a_Hopper,
		int a_DstSlotNum,
		cBlockEntityWithItems & a_SrcEntity,
		int a_SrcSlotNum
	) = 0;
	virtual bool OnHopperPushingItem(
		cWorld & a_World,
		cHopperEntity & a_Hopper,
		int a_SrcSlotNum,
		cBlockEntityWithItems & a_DstEntity,
		int a_DstSlotNum
	) = 0;
	virtual bool OnDropSpense(cWorld & a_World, cDropSpenserEntity & a_DropSpenser, int a_SlotNum) = 0;
	virtual bool OnKilled(cEntity & a_Victim, TakeDamageInfo & a_TDI, AString & a_DeathMessage) = 0;
	virtual bool OnKilling(cEntity & a_Victim, cEntity * a_Killer, TakeDamageInfo & a_TDI) = 0;
	virtual bool OnLogin(cClientHandle & a_Client, UInt32 a_ProtocolVersion, const AString & a_Username) = 0;
	virtual bool OnLoginForge(cClientHandle & a_Client, const AStringMap & a_Mods) = 0;
	virtual bool OnPlayerAnimation(cPlayer & a_Player, int a_Animation) = 0;
	virtual bool OnPlayerBreakingBlock(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		BLOCKTYPE a_BlockType,
		NIBBLETYPE a_BlockMeta
	) = 0;
	virtual bool OnPlayerBrokenBlock(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		BLOCKTYPE a_BlockType,
		NIBBLETYPE a_BlockMeta
	) = 0;
	virtual bool OnPlayerDestroyed(cPlayer & a_Player) = 0;
	virtual bool OnPlayerEating(cPlayer & a_Player) = 0;
	virtual bool OnPlayerFished(cPlayer & a_Player, const cItems & a_Reward, const int ExperienceAmount) = 0;
	virtual bool OnPlayerFishing(cPlayer & a_Player, cItems & a_Reward, int & ExperienceAmount) = 0;
	virtual bool OnPlayerFoodLevelChange(cPlayer & a_Player, int a_NewFoodLevel) = 0;
	virtual bool OnPlayerJoined(cPlayer & a_Player) = 0;
	virtual bool OnPlayerLeftClick(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		char a_Status
	) = 0;
	virtual bool OnPlayerMoving(
		cPlayer & a_Player,
		const Vector3d & a_OldPosition,
		const Vector3d & a_NewPosition,
		bool a_PreviousIsOnGround
	) = 0;
	virtual bool OnPlayerOpeningWindow(cPlayer & a_Player, cWindow & a_Window) = 0;
	virtual bool OnPlayerPlacedBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange) = 0;
	virtual bool OnPlayerPlacingBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange) = 0;
	virtual bool OnPlayerCrouched(cPlayer & a_Player) = 0;
	virtual bool OnPlayerRightClick(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		int a_CursorX,
		int a_CursorY,
		int a_CursorZ
	) = 0;
	virtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) = 0;
	virtual bool OnPlayerShooting(cPlayer & a_Player) = 0;
	virtual bool OnPlayerSpawned(cPlayer & a_Player) = 0;
	virtual bool OnPlayerTossingItem(cPlayer & a_Player) = 0;
	virtual bool OnPlayerUsedBlock(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		int a_CursorX,
		int a_CursorY,
		int a_CursorZ,
		BLOCKTYPE a_BlockType,
		NIBBLETYPE a_BlockMeta
	) = 0;
	virtual bool OnPlayerUsedItem(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		int a_CursorX,
		int a_CursorY,
		int a_CursorZ
	) = 0;
	virtual bool OnPlayerUsingBlock(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		int a_CursorX,
		int a_CursorY,
		int a_CursorZ,
		BLOCKTYPE a_BlockType,
		NIBBLETYPE a_BlockMeta
	) = 0;
	virtual bool OnPlayerUsingItem(
		cPlayer & a_Player,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_BlockFace,
		int a_CursorX,
		int a_CursorY,
		int a_CursorZ
	) = 0;
	virtual bool OnPluginMessage(
		cClientHandle & a_Client,
		const AString & a_Channel,
		ContiguousByteBufferView a_Message
	) = 0;
	virtual bool OnPluginsLoaded(void) = 0;
	virtual bool OnPostCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;
	virtual bool OnPreCrafting(cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;
	virtual bool OnProjectileHitBlock(
		cProjectileEntity & a_Projectile,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		eBlockFace a_Face,
		const Vector3d & a_BlockHitPos
	) = 0;
	virtual bool OnProjectileHitEntity(cProjectileEntity & a_Projectile, cEntity & a_HitEntity) = 0;
	virtual bool OnServerPing(
		cClientHandle & a_ClientHandle,
		AString & a_ServerDescription,
		int & a_OnlinePlayersCount,
		int & a_MaxPlayersCount,
		AString & a_Favicon
	) = 0;
	virtual bool OnSpawnedEntity(cWorld & a_World, cEntity & a_Entity) = 0;
	virtual bool OnSpawnedMonster(cWorld & a_World, cMonster & a_Monster) = 0;
	virtual bool OnSpawningEntity(cWorld & a_World, cEntity & a_Entity) = 0;
	virtual bool OnSpawningMonster(cWorld & a_World, cMonster & a_Monster) = 0;
	virtual bool OnTakeDamage(cEntity & a_Receiver, TakeDamageInfo & a_TakeDamageInfo) = 0;
	virtual bool OnUpdatedSign(
		cWorld & a_World,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		const AString & a_Line1,
		const AString & a_Line2,
		const AString & a_Line3,
		const AString & a_Line4,
		cPlayer * a_Player
	) = 0;
	virtual bool OnUpdatingSign(
		cWorld & a_World,
		int a_BlockX,
		int a_BlockY,
		int a_BlockZ,
		AString & a_Line1,
		AString & a_Line2,
		AString & a_Line3,
		AString & a_Line4,
		cPlayer * a_Player
	) = 0;
	virtual bool OnWeatherChanged(cWorld & a_World) = 0;
	virtual bool OnWeatherChanging(cWorld & a_World, eWeather & a_NewWeather) = 0;
	virtual bool OnWorldStarted(cWorld & a_World) = 0;
	virtual bool OnWorldTick(
		cWorld & a_World,
		std::chrono::milliseconds a_Dt,
		std::chrono::milliseconds a_LastTickDurationMSec
	) = 0;

	// tolua_begin
	const AString & GetName(void) const { return m_Name; }
	void SetName(const AString & a_Name) { m_Name = a_Name; }

	int GetVersion(void) const { return m_Version; }
	void SetVersion(int a_Version) { m_Version = a_Version; }

	/** Returns the name of the folder (in the Plugins folder) from which the plugin is loaded. */
	const AString & GetFolderName(void) const { return m_FolderName; }

	/** Returns the folder relative to the MCS Executable, from which the plugin is loaded. */
	AString GetLocalFolder(void) const;

	/** Returns the error encountered while loading the plugin. Only valid if m_Status == psError. */
	const AString & GetLoadError(void) const { return m_LoadError; }

	cPluginManager::ePluginStatus GetStatus(void) const { return m_Status; }

	bool IsLoaded(void) const { return (m_Status == cPluginManager::psLoaded); }
	// tolua_end

	// Needed for ManualBindings' tolua_ForEach<>
	static const char * GetClassStatic(void) { return "cPlugin"; }

  protected:
	friend class cPluginManager;

	cPluginManager::ePluginStatus m_Status;

	/** The name of the plugin, used to identify the plugin in the system and for inter-plugin calls. */
	AString m_Name;

	int m_Version;

	/** Name of the folder (in the Plugins folder) from which the plugin is loaded. */
	AString m_FolderName;

	/** The error encountered while loading the plugin.
	Only valid if m_Status == psError. */
	AString m_LoadError;


	/** Sets m_LoadError to the specified string and m_Status to psError. */
	void SetLoadError(const AString & a_LoadError);
};  // tolua_export