#undef DEBUG
using System.Collections.Generic;
using System;
using System.Linq;
using RageCoop.Core;
namespace RageCoop.Client.Scripting
{
///
/// Provides vital functionality to interact with RAGECOOP
///
public static class API
{
///
/// Client configuration, this will conflict with server-side config.
///
public static class Config
{
///
/// Get or set local player's username, set won't be effective if already connected to a server.
///
public static string Username
{
get { return Main.Settings.Username; }
set
{
if (IsOnServer || string.IsNullOrEmpty(value))
{
return;
}
Main.Settings.Username = value;
}
}
///
/// Enable automatic respawn for this player.
///
public static bool EnableAutoRespawn { get; set; } = true;
}
///
/// Base events for RageCoop
///
public static class Events
{
#region DELEGATES
public delegate void EmptyEvent();
public delegate void CustomEvent(int hash, List args);
#endregion
///
/// The local player is dead
///
public static event EmptyEvent OnPlayerDied;
///
/// A local vehicle is spawned
///
public static event EventHandler OnVehicleSpawned;
///
/// A local vehicle is deleted
///
public static event EventHandler OnVehicleDeleted;
///
/// A local ped is spawned
///
public static event EventHandler OnPedSpawned;
///
/// A local ped is deleted
///
public static event EventHandler OnPedDeleted;
///
/// This is equivalent of .
///
public static event EmptyEvent OnTick;
///
/// This will be invoked when a CustomEvent is received from the server.
///
public static event CustomEvent OnCustomEventReceived;
#region INVOKE
internal static void InvokeVehicleSpawned(SyncedVehicle v) { OnVehicleSpawned?.Invoke(null, v); }
internal static void InvokeVehicleDeleted(SyncedVehicle v) { OnVehicleDeleted?.Invoke(null, v); }
internal static void InvokePedSpawned(SyncedPed p) { OnPedSpawned?.Invoke(null, p); }
internal static void InvokePedDeleted(SyncedPed p) { OnPedDeleted?.Invoke(null, p); }
internal static void InvokePlayerDied() { OnPlayerDied?.Invoke(); }
internal static void InvokeTick() { OnTick?.Invoke(); }
internal static void InvokeCustomEventReceived(int hash, List args)
{
OnCustomEventReceived?.Invoke(hash, args);
}
#endregion
internal static void ClearHandlers()
{
OnPlayerDied=null;
OnTick=null;
OnPedDeleted=null;
OnPedSpawned=null;
OnVehicleDeleted=null;
OnVehicleSpawned=null;
OnCustomEventReceived=null;
}
}
#region FUNCTIONS
///
/// Send a local chat message to this player
///
/// Name of the sender
/// The player's message
public static void LocalChatMessage(string from, string message)
{
Main.MainChat.AddMessage(from, message);
}
///
/// Get a that RAGECOOP is currently using.
///
///
public static Core.Logging.Logger GetLogger()
{
return Main.Logger;
}
///
/// Queue an action to be executed on next tick.
///
///
public static void QueueAction(Action a)
{
Main.QueueAction(a);
}
///
/// Disconnect from the server
///
public static void Disconnect()
{
Networking.ToggleConnection(null);
}
///
/// Check if the player is already on a server
///
public static bool IsOnServer
{
get { return Networking.IsOnServer; }
}
///
/// Get the local player's ID
///
/// PlayerID
public static int LocalPlayerID
{
get { return Main.LocalPlayerID; }
}
///
/// Check if a RAGECOOP menu is visible
///
public static bool IsMenuVisible
{
get { return Menus.CoopMenu.MenuPool.AreAnyVisible; }
}
///
/// Check if the RAGECOOP chat is visible
///
public static bool IsChatFocused
{
get { return Main.MainChat.Focused; }
}
///
/// Check if the RAGECOOP list of players is visible
///
public static bool IsPlayerListVisible
{
get { return Util.GetTickCount64() - PlayerList.Pressed < 5000; }
}
///
/// Get the version of RAGECOOP
///
public static string CurrentVersion
{
get { return Main.CurrentVersion; }
}
///
/// Send an event and data to the specified clients.
///
/// An unique identifier of the event
/// The objects conataing your data, supported types:
/// byte, short, ushort, int, uint, long, ulong, float, bool, string.
public static void SendCustomEvent(int eventHash, List args)
{
var p = new Packets.CustomEvent()
{
Args=args,
Hash=eventHash
};
Networking.Send(p, ConnectionChannel.Event, Lidgren.Network.NetDeliveryMethod.ReliableOrdered);
}
#endregion
}
}