-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNetWrapper.cs
148 lines (127 loc) · 4.31 KB
/
NetWrapper.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
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
using Oc;
using Oc.Dungeon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using UniRx;
namespace CraftopiaDiscord
{
/// <summary>
/// Wrapper to access info about the current game session
/// </summary>
class NetWrapper
{
private static Player CACHED_localPlayer;
public static int MaxPlayers => OcNetMng.MAX_PLAYER_NUM;
public static int ConnectedPlayersCount => SingletonMonoBehaviour<OcNetMng>.Inst.ConnectPlayerNum;
public static bool IsMultiplayer => SingletonMonoBehaviour<OcNetMng>.Inst.isMutilPlay;
/// <summary>
/// Get your current player instance
/// </summary>
public static Player LocalPlayer
{
get
{
if (CACHED_localPlayer == null || !CACHED_localPlayer.IsValid)
{
CACHED_localPlayer = new Player();
}
return CACHED_localPlayer;
}
}
}
/// <summary>
/// Wrapper to access local player character data
/// </summary>
public class Player
{
OcPlMaster internalPlayer;
public Stats Stats;
private int lastDungeonId = -1;
public Player() : this(OcPlMaster.Inst){}
public Player(OcPlMaster internalPlayer)
{
this.internalPlayer = internalPlayer;
this.Stats = new Stats(this);
this.RegisterEnterExitDungeonCallback((int index) => {
lastDungeonId = index;
});
}
/// <summary>
/// Check if the local player object is available
/// (if you're currently ingame or not)
/// </summary>
public bool IsValid => internalPlayer != null;
/// <summary>
/// Access some internal player data, use with caution
/// </summary>
public OcPlMaster InternalPlayer => internalPlayer;
/// <summary>
/// Access dungeons manager, use with caution
/// </summary>
public OcDungeonManager InternalDungeonManager => SingletonMonoBehaviour<OcDungeonManager>.Inst;
/// <summary>
/// Check if player is currently inside a dungeon
/// </summary>
public bool IsInsideADungeon => CurrentDungeon != null;
/// <summary>
/// Get current dungeon internal object. If null means that you're not in a dungeon.
/// </summary>
public OcDungeonSo CurrentDungeon
{
get
{
if (!IsValid || InternalPlayer.CurrentDungeonId == -1)
return null;
return GetDungeonData(InternalPlayer.CurrentDungeonId);
}
}
/// <summary>
/// Get current dungeon internal object by its index. If null means that you're not in a dungeon.
/// </summary>
public OcDungeonSo GetDungeonData(int index)
{
return InternalDungeonManager.GetDungeonData(index);
}
public bool RegisterEnterExitDungeonCallback(Action<int> action)
{
if (!IsValid)
return false;
SingletonMonoBehaviour<OcDungeonManager>.Inst.onEnterDungeon += action;
return true;
}
}
/// <summary>
/// Wrapper to access character exp and level
/// </summary>
public class Stats
{
Player player;
public Stats(Player pl)
{
this.player = pl;
}
public byte Level => player.InternalPlayer.PlLevelCtrl.Level.Value;
public long PlayerExp => player.InternalPlayer.PlLevelCtrl.Exp.Value;
public long PlayerNextLevelExp
{
get
{
if (player.IsValid)
return ((LongReactiveProperty)typeof(OcPlLevelCtrl).GetField("requirNextLevelUpExp", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(player.InternalPlayer.PlLevelCtrl)).Value;
return -1;
}
}
public bool RegisterAddExpCallback(Action<long> action)
{
if (player.IsValid)
return false;
OcPlLevelCtrl levelCtrl = player.InternalPlayer.PlLevelCtrl;
levelCtrl.AddExpEvent += action;
return true;
}
}
}