-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMod.cs
98 lines (88 loc) · 3.62 KB
/
Mod.cs
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
using Sandbox.Game.Entities;
using Sandbox.ModAPI;
using System.Collections.Generic;
using VRage.Game;
using VRage.Game.Components;
using VRage.ModAPI;
using VRage.Utils;
namespace StalkR.AsteroidOres
{
// ISide abstracts each side (client/server) implementations.
interface ISide
{
void UnloadData();
void OnEntityAdd(IMyEntity entity);
void OnEntityRemove(IMyEntity entity);
void UpdateBeforeSimulation100();
void OnMessage(ushort handlerId, byte[] serialized, ulong senderPlayerId, bool isArrivedFromServer);
}
[MySessionComponentDescriptor(MyUpdateOrder.BeforeSimulation)]
public class Mod : MySessionComponentBase
{
const ushort MOD_ID = 27283;
private ISide side;
public override void LoadData()
{
MyLog.Default.WriteLineAndConsole($"AsteroidOres: LoadData: mod loading");
var isServer = MyAPIGateway.Session.OnlineMode == MyOnlineModeEnum.OFFLINE
|| MyAPIGateway.Multiplayer.IsServer
|| MyAPIGateway.Utilities.IsDedicated;
if (isServer) side = new Server();
else side = new Client();
MyAPIGateway.Multiplayer.RegisterSecureMessageHandler(MOD_ID, side.OnMessage);
MyLog.Default.WriteLineAndConsole($"AsteroidOres: LoadData: mod loaded (isServer: {isServer})");
}
protected override void UnloadData()
{
MyLog.Default.WriteLineAndConsole($"AsteroidOres: UnloadData: mod unloading");
MyAPIGateway.Entities.OnEntityAdd -= side.OnEntityAdd;
MyAPIGateway.Entities.OnEntityRemove -= side.OnEntityRemove;
MyAPIGateway.Multiplayer.UnregisterSecureMessageHandler(MOD_ID, side.OnMessage);
side.UnloadData();
MyLog.Default.WriteLineAndConsole($"AsteroidOres: UnloadData: mod unloaded");
}
public override void BeforeStart()
{
MyLog.Default.WriteLineAndConsole($"AsteroidOres: BeforeStart: mod starting");
HashSet<IMyEntity> entities = new HashSet<IMyEntity>();
MyAPIGateway.Entities.GetEntities(entities, (IMyEntity entity) =>
{
side.OnEntityAdd(entity);
return false;
});
MyAPIGateway.Entities.OnEntityAdd += side.OnEntityAdd;
MyAPIGateway.Entities.OnEntityRemove += side.OnEntityRemove;
MyLog.Default.WriteLineAndConsole($"AsteroidOres: BeforeStart: mod started");
}
private int ticks = 0;
public override void UpdateBeforeSimulation()
{
ticks++;
if (ticks >= 100)
{
side.UpdateBeforeSimulation100();
ticks = 0;
}
}
public static bool isAsteroid(MyVoxelBase voxel)
{
// skip MyPlanet, MyVoxelPhysics
if (!(voxel is MyVoxelMap)) return false;
// skip boulders
if (voxel.StorageName == null || !voxel.StorageName.StartsWith("Asteroid")) return false;
return true;
}
public static bool SendMessageTo(byte[] message, ulong recipient)
{
return MyAPIGateway.Multiplayer.SendMessageTo(MOD_ID, message, recipient);
}
public static bool SendMessageToServer(byte[] message)
{
return MyAPIGateway.Multiplayer.SendMessageToServer(MOD_ID, message);
}
public static void Log(string message)
{
//MyLog.Default.WriteLineAndConsole(message);
}
}
}