Skip to content
This repository was archived by the owner on Aug 9, 2023. It is now read-only.

Commit 65bd755

Browse files
authored
Merge pull request #110 from SynapseSL/patch
Synapse 2.10.1
2 parents 7886091 + dfcca31 commit 65bd755

15 files changed

+159
-69
lines changed

Synapse/Api/CustomObjects/SynapseDoorObject.cs

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public SynapseDoorObject(SpawnableDoorType type, Vector3 position, Quaternion ro
3535
public override GameObject GameObject => Door.GameObject;
3636
public override NetworkIdentity NetworkIdentity => Door.VDoor.netIdentity;
3737
public override ObjectType Type => ObjectType.Door;
38+
public override void Destroy()
39+
{
40+
Map.Get.Doors.Remove(Door);
41+
base.Destroy();
42+
}
3843

3944
public Door Door { get; }
4045
public SpawnableDoorType DoorType { get; }

Synapse/Api/CustomObjects/SynapseGeneratorObject.cs

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ internal SynapseGeneratorObject(SynapseSchematic.GeneratorConfiguration configur
3232
public override GameObject GameObject => Generator.GameObject;
3333
public override NetworkIdentity NetworkIdentity => Generator.generator.netIdentity;
3434
public override ObjectType Type => ObjectType.Generator;
35+
public override void Destroy()
36+
{
37+
//The Generator will add itself on first Start to Map.Generators
38+
Map.Get.Generators.Remove(Generator);
39+
base.Destroy();
40+
}
3541

3642
public Generator Generator { get; }
3743
}

Synapse/Api/CustomObjects/SynapseLockerObject.cs

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ internal SynapseLockerObject(SynapseSchematic.LockerConfiguration configuration)
4242
public override NetworkIdentity NetworkIdentity => Locker.locker.netIdentity;
4343
public override GameObject GameObject => Locker.GameObject;
4444
public override ObjectType Type => ObjectType.Locker;
45+
public override void Destroy()
46+
{
47+
Map.Get.Lockers.Remove(Locker);
48+
base.Destroy();
49+
}
4550

4651
public LockerType LockerType { get; }
4752

Synapse/Api/CustomObjects/SynapseRagdollObject.cs

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public override void ApplyPhysics()
4242
foreach (var rigid in Ragdoll.ragdoll.AllRigidbodies)
4343
rigid.useGravity = true;
4444
}
45+
public override void Destroy()
46+
{
47+
Map.Get.Ragdolls.Remove(Ragdoll);
48+
base.Destroy();
49+
}
4550

4651
public RoleType RoleType => Ragdoll.RoleType;
4752
public DamageType DamageType => Ragdoll.ragdoll.Info.Handler.GetDamageType();

Synapse/Api/CustomObjects/SynapseWorkStationObject.cs

+5
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public SynapseWorkStationObject(Vector3 position, Quaternion rotation, Vector3 s
4444
public override GameObject GameObject => WorkStation.GameObject;
4545
public override NetworkIdentity NetworkIdentity => WorkStation.workStation.netIdentity;
4646
public override ObjectType Type => ObjectType.Workstation;
47+
public override void Destroy()
48+
{
49+
Map.Get.WorkStations.Remove(WorkStation);
50+
base.Destroy();
51+
}
4752

4853

4954
public WorkStation WorkStation { get; }

Synapse/Api/Enum/Effect.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public enum Effect
136136
/// <summary>
137137
/// Increases movement speed
138138
/// </summary>
139-
/// <remarks>0 = Disabled, each intensity point adds 1% of movement speed (max 355)</remarks>
139+
/// <remarks>0 = Disabled, each intensity point adds 1% of movement speed (max 255)</remarks>
140140
MovementBoost,
141141
/// <summary>
142142
/// Reduces severity of Amnesia, Bleeding, Burned, Concussed, Hemorrhage, Poisoned and SCP-207.
@@ -158,5 +158,10 @@ public enum Effect
158158
/// </summary>
159159
/// <remarks>0 = Disabled, 1 = Enabled</remarks>
160160
Vitality,
161+
/// <summary>
162+
/// Turns the screen black.
163+
/// </summary>
164+
/// <remarks>0 = Disabled, 1 = Enabled</remarks>
165+
Visuals173Blink
161166
}
162167
}

Synapse/Api/Events/ScpEvents.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Synapse.Api.Enum;
1+
using Synapse.Api.Enum;
22
using Synapse.Api.Events.SynapseEventArguments;
33
using UnityEngine;
44

Synapse/Api/Events/SynapseEventArguments/ScpEventArgs.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using UnityEngine;
1+
using UnityEngine;
22

33
namespace Synapse.Api.Events.SynapseEventArguments
44
{
@@ -152,4 +152,4 @@ public class Scp049ReviveEvent : EventHandler.ISynapseEventArgs
152152
public bool Finish { get; internal set; }
153153
public bool Allow { get; set; } = true;
154154
}
155-
}
155+
}

Synapse/Api/Map.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ public SynapseItem SpawnGrenade(Vector3 position, Vector3 velocity, float fuseti
136136
var grenadeitem = new SynapseItem(itemtype, position);
137137
grenadeitem.Throwable.Fuse();
138138
grenadeitem.Throwable.FuseTime = fusetime;
139-
if (player != null)
140-
grenadeitem.Throwable.ThrowableItem.PreviousOwner = new Footprinting.Footprint(player.Hub);
139+
140+
if (player == null) player = Server.Get.Host;
141+
grenadeitem.Throwable.ThrowableItem.PreviousOwner = new Footprinting.Footprint(player.Hub);
141142

142143
if(grenadeitem.Throwable.ThrowableItem.TryGetComponent<Rigidbody>(out var rgb))
143144
rgb.velocity = velocity;

Synapse/Api/Player.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,13 @@ public uint GetPreference(ItemType item)
7878

7979
public void ChangeRoleAtPosition(RoleType role)
8080
{
81-
RoleChangeClassIdPatch.ForceLite = true;
81+
LiteRoleSet = true;
8282
Hub.characterClassManager.SetClassIDAdv(role, true, CharacterClassManager.SpawnReason.ForceClass);
83-
RoleChangeClassIdPatch.ForceLite = false;
83+
LiteRoleSet = false;
8484
}
8585

86+
internal bool LiteRoleSet { get; set; } = false;
87+
8688
public void GiveTextHint(string message, float duration = 5f)
8789
{
8890
Hub.hints.Show(new TextHint(message, new HintParameter[]

Synapse/Patches/EventsPatches/PlayerPatches/PlayerBasicItemUsePatch.cs

+105-50
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,67 @@
22
using HarmonyLib;
33
using InventorySystem.Items.Usables;
44
using Mirror;
5-
using Synapse.Api;
65
using Synapse.Api.Events.SynapseEventArguments;
6+
using UnityEngine;
7+
using Utils.Networking;
8+
using Logger = Synapse.Api.Logger;
79

810
namespace Synapse.Patches.EventsPatches.PlayerPatches
911
{
10-
[HarmonyPatch(typeof(UsableItem), nameof(UsableItem.OnUsingStarted))]
11-
internal static class UsableStartPatch
12+
[HarmonyPatch(typeof(UsableItemsController), nameof(UsableItemsController.ServerReceivedStatus))]
13+
internal static class ReceivedMessagePatch
1214
{
1315
[HarmonyPrefix]
14-
private static bool StartPatch(UsableItem __instance)
16+
private static bool OnMessage(NetworkConnection conn, StatusMessage msg)
1517
{
1618
try
1719
{
18-
var item = __instance.GetSynapseItem();
19-
var player = item.ItemHolder;
20+
var player = conn.GetPlayer();
21+
if (player == null) return false;
22+
if (player.ItemInHand.Serial != msg.ItemSerial) return false;
23+
if (!(player.ItemInHand.ItemBase is UsableItem usable)) return false;
24+
var handler = UsableItemsController.GetHandler(player.Hub);
2025
var allow = true;
21-
22-
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Initiating, ref allow);
23-
24-
return allow;
26+
var item = player.ItemInHand;
27+
switch (msg.Status)
28+
{
29+
case StatusMessage.StatusType.Start:
30+
if (handler.CurrentUsable.ItemSerial != 0) return false;
31+
if (!usable.CanStartUsing) return false;
32+
var cooldown = UsableItemsController.GetCooldown(msg.ItemSerial, usable, handler);
33+
if (cooldown > 0f)
34+
{
35+
conn.Send(new ItemCooldownMessage(msg.ItemSerial, cooldown));
36+
return false;
37+
}
38+
39+
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Initiating, ref allow);
40+
if (!allow) return false;
41+
42+
handler.CurrentUsable = new CurrentlyUsedItem(usable, msg.ItemSerial, Time.timeSinceLevelLoad);
43+
handler.CurrentUsable.Item.OnUsingStarted();
44+
new StatusMessage(StatusMessage.StatusType.Start,msg.ItemSerial).SendToAuthenticated();
45+
break;
46+
47+
case StatusMessage.StatusType.Cancel:
48+
if (handler.CurrentUsable.ItemSerial == 0) return false;
49+
if (handler.CurrentUsable.StartTime + handler.CurrentUsable.Item.MaxCancellableTime <=
50+
Time.timeSinceLevelLoad) return false;
51+
52+
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Stopping, ref allow);
53+
if (!allow) return false;
54+
55+
handler.CurrentUsable.Item.OnUsingCancelled();
56+
handler.CurrentUsable = CurrentlyUsedItem.None;
57+
new StatusMessage(StatusMessage.StatusType.Cancel, msg.ItemSerial).SendToAuthenticated();
58+
break;
59+
}
60+
61+
return false;
2562
}
26-
catch (Exception e)
63+
catch (Exception ex)
2764
{
28-
Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Start failed!!\n{e}");
65+
Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Receive Message failed!!\n{ex}");
2966
return true;
3067
}
3168
}
@@ -34,25 +71,30 @@ private static bool StartPatch(UsableItem __instance)
3471
[HarmonyPatch(typeof(Consumable), nameof(Consumable.ServerOnUsingCompleted))]
3572
internal static class UsableUsingCompletePatch
3673
{
74+
internal static bool ExecuteFinalizingEvent(Consumable consumable)
75+
{
76+
var item = consumable.GetSynapseItem();
77+
var player = item.ItemHolder;
78+
var allow = true;
79+
80+
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Finalizing, ref allow);
81+
82+
if (!allow)
83+
{
84+
consumable.OnUsingCancelled();
85+
var handler = UsableItemsController.GetHandler(consumable.Owner);
86+
handler.CurrentUsable = CurrentlyUsedItem.None;
87+
NetworkServer.SendToAll(new StatusMessage(StatusMessage.StatusType.Cancel, item.Serial), 0, false);
88+
}
89+
return allow;
90+
}
91+
3792
[HarmonyPrefix]
3893
private static bool CompletePatch(Consumable __instance)
3994
{
4095
try
4196
{
42-
var item = __instance.GetSynapseItem();
43-
var player = item.ItemHolder;
44-
var allow = true;
45-
46-
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Finalizing, ref allow);
47-
48-
if (!allow)
49-
{
50-
__instance.OnUsingCancelled();
51-
var handler = UsableItemsController.GetHandler(__instance.Owner);
52-
handler.CurrentUsable = CurrentlyUsedItem.None;
53-
NetworkServer.SendToAll(new StatusMessage(StatusMessage.StatusType.Cancel, item.Serial), 0, false);
54-
}
55-
return allow;
97+
return ExecuteFinalizingEvent(__instance);
5698
}
5799
catch (Exception e)
58100
{
@@ -70,20 +112,7 @@ private static bool CompletePatch(Consumable __instance)
70112
{
71113
try
72114
{
73-
var item = __instance.GetSynapseItem();
74-
var player = item.ItemHolder;
75-
var allow = true;
76-
77-
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Finalizing, ref allow);
78-
79-
if (!allow)
80-
{
81-
__instance.OnUsingCancelled();
82-
var handler = UsableItemsController.GetHandler(__instance.Owner);
83-
handler.CurrentUsable = CurrentlyUsedItem.None;
84-
NetworkServer.SendToAll(new StatusMessage(StatusMessage.StatusType.Cancel, item.Serial), 0, false);
85-
}
86-
return allow;
115+
return UsableUsingCompletePatch.ExecuteFinalizingEvent(__instance);
87116
}
88117
catch (Exception e)
89118
{
@@ -93,25 +122,51 @@ private static bool CompletePatch(Consumable __instance)
93122
}
94123
}
95124

96-
[HarmonyPatch(typeof(UsableItem), nameof(UsableItem.OnUsingCancelled))]
97-
internal static class UsableCancelPatch
125+
[HarmonyPatch(typeof(Consumable), nameof(Consumable.EquipUpdate))]
126+
internal static class EquipPatch
98127
{
99128
[HarmonyPrefix]
100-
private static bool CancelPatch(UsableItem __instance)
129+
private static bool OnEquip(Consumable __instance)
101130
{
102131
try
103132
{
104-
var item = __instance.GetSynapseItem();
105-
var player = item.ItemHolder;
106-
var allow = true;
133+
if (__instance.ActivationReady)
134+
{
135+
if(UsableUsingCompletePatch.ExecuteFinalizingEvent(__instance))
136+
__instance.ActivateEffects();
137+
}
138+
return false;
139+
}
140+
catch (Exception ex)
141+
{
142+
Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Finalizing Equip failed!!\n{ex}");
143+
return true;
144+
}
145+
}
146+
}
107147

108-
Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Stopping, ref allow);
148+
[HarmonyPatch(typeof(Consumable), nameof(Consumable.OnRemoved))]
149+
internal static class RemovedPatch
150+
{
151+
[HarmonyPrefix]
152+
private static bool OnRemove(Consumable __instance,InventorySystem.Items.Pickups.ItemPickupBase pickup)
153+
{
154+
try
155+
{
156+
if(__instance.ActivationReady && UsableUsingCompletePatch.ExecuteFinalizingEvent(__instance))
157+
__instance.ActivateEffects();
158+
159+
if(__instance._alreadyActivated && pickup != null)
160+
pickup.DestroySelf();
161+
162+
if(NetworkServer.active)
163+
UsableItemsController.GetHandler(__instance.Owner).CurrentUsable = CurrentlyUsedItem.None;
109164

110-
return allow;
165+
return false;
111166
}
112-
catch (Exception e)
167+
catch (Exception ex)
113168
{
114-
Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Cancel failed!!\n{e}");
169+
Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Finalizing Remove failed!!\n{ex}");
115170
return true;
116171
}
117172
}

Synapse/Patches/EventsPatches/PlayerPatches/PlayerSetClassPatches.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ private static bool OnPlayerMovementSync(PlayerMovementSync __instance)
113113
{
114114
var player = __instance.GetPlayer();
115115
var args = player.setClassEventArgs;
116-
if (args == null) return false;
116+
if (player.LiteRoleSet) return false;
117+
if (args == null) return true;
117118
var rot = new PlayerMovementSync.PlayerRotation?(new PlayerMovementSync.PlayerRotation(new float?(0f), new float?(args.Rotation)));
118119
Timing.RunCoroutine(__instance.SafelySpawnPlayer(args.Position, rot), Segment.FixedUpdate);
119120
return false;
@@ -180,7 +181,7 @@ private static bool OnClassChanged(HealthStat __instance)
180181
try
181182
{
182183
var player = __instance.GetPlayer();
183-
if (player.setClassEventArgs == null) return false;
184+
if (player.LiteRoleSet) return false;
184185

185186
player.MaxHealth = player.ClassManager.CurRole.maxHP;
186187
return true;
@@ -201,7 +202,7 @@ private static bool OnReset(ReferenceHub ply)
201202
{
202203
try
203204
{
204-
if (ply?.GetPlayer()?.setClassEventArgs == null) return false;
205+
if (ply?.GetPlayer().LiteRoleSet == true) return false;
205206
return true;
206207
}
207208
catch(Exception ex)
@@ -220,7 +221,7 @@ private static bool OnReset(ReferenceHub targetHub)
220221
{
221222
try
222223
{
223-
if (targetHub?.GetPlayer()?.setClassEventArgs == null) return false;
224+
if (targetHub?.GetPlayer()?.LiteRoleSet == true) return false;
224225
return true;
225226
}
226227
catch (Exception ex)

Synapse/Patches/SynapsePatches/Wrapper/RoleChangeClassIdPatch.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ namespace Synapse.Patches.EventsPatches.PlayerPatches
66
[HarmonyPatch(typeof(CharacterClassManager), nameof(CharacterClassManager.SetClassIDHook))]
77
internal static class RoleChangeClassIdPatch
88
{
9-
internal static bool ForceLite = false;
10-
119
[HarmonyPrefix]
1210
private static bool SetClass(CharacterClassManager __instance, RoleType id)
1311
{
14-
__instance.SetClassIDAdv(id, ForceLite, CharacterClassManager.SpawnReason.None, true);
12+
var player = __instance.GetPlayer();
13+
__instance.SetClassIDAdv(id, player.LiteRoleSet, CharacterClassManager.SpawnReason.None, true);
1514
return false;
1615
}
1716
}
@@ -22,7 +21,8 @@ internal static class RoleChangeClassIdPatch2
2221
[HarmonyPrefix]
2322
private static bool SetClass(CharacterClassManager __instance, RoleType id, CharacterClassManager.SpawnReason spawnReason)
2423
{
25-
__instance.SetClassIDAdv(id, RoleChangeClassIdPatch.ForceLite, spawnReason, false);
24+
var player = __instance.GetPlayer();
25+
__instance.SetClassIDAdv(id, player.LiteRoleSet, spawnReason, false);
2626
return false;
2727
}
2828
}

0 commit comments

Comments
 (0)