- Katılım
- 4 yıl 8 ay 6 gün
- Mesajlar
- 440
- Discord
- MiddleStonks#1877
Hepinize merhaba! FiveM'in C # ortamındaki özel durumları kapsayan küçük bir kılavuz yapmaya karar verdim.
1. Yerel / API Geri Çağırmaları
Yerel veya API sarma yöntemleri , BaseScript'ten türetilmiş bir sınıfın yapıcısında çalıştırılmamalıdır (buradaki davranış tam olarak bilinmemekle birlikte bu çoğunlukla istemci için geçerlidir)
-
Bu sınırlama için bir geçici çözüm, Function veya API çağrılarını ve ilk tıklamada Function veya API çağrılarını kullanan herhangi bir yöntemi yürütmektir:
C#:
public class TestScript : BaseScript
{
#region Private Fields
private bool firstTick = false;
#endregion
#region Initialization
public TestScript()
{
Tick += OnTick;
}
#endregion
#region Private Methods
private async Task OnTick()
{
if(!firstTick)
{
firstTick = true;
// API calls.
}
}
#endregion
}
2. NUI Geri Çağırmaları (İstemci)
API geri aramaları aldatıcıdır. NUI ve istemci arasındaki iletişim JavaScript'te yapıldığından, döndürülen veriler zaten ayrıştırılır ve ExpandoObject özelliklerine gönderilir.
C#:
// ... Inside BaseScript
# NUI Implementation
private void RegisterNUICallback(string msg, Func<IDictionary<string, object>, CallbackDelegate, CallbackDelegate> callback)
{
API.RegisterNuiCallbackType(msg); // Remember API calls must be executed on the first tick at the earliest!
EventHandlers[$"__cfx_nui:{msg}"] += new Action<ExpandoObject, CallbackDelegate>((body, resultCallback) =>
{
callback.Invoke(body, resultCallback);
});
}
#endregion
Eğer nüfuz etmesi için bir saniye gerekir ve sistem düzenleyecektir. Burada yaptığımız özel olay önceki ile NUI olayları dinlemek olduğu.: _
_cfx_nui:{eventName}. FiveM çerçevesi bunu böyle yapıyor, bu yüzden itaat etmemiz gerekiyor. Şimdi özel olan, geçirilen argümanlardır. DAİMA ExpandoObject ve CallbackDelegate türünde olacaktır. ExpandoObject bizim verilerimizdir (daha fazla bilgi için tür ve DLR hakkında google). ExpandoObject, IDictionary <string, object> tipindedir ve esasen verileri <VariableName, VariableData> ile tutar.
Esasen RegisterNUICallback komutumuz, olay ortaya çıktığında çağırdığımız bir geri aramayı kabul eder. Bu yüzden hayatı kolaylaştırır ve geri aramaya IDictionary olarak aktarırız.
Not: İkinci geçirilen parametrenin (CallbackDelegate türünde) ne için olduğunu henüz keşfetmedim. Lütfen yapabiliyorsanız paylaşın!
3. API RegisterCommand (Sunucu)
Bu da başka bir zor komuttur. RegisterCommand uzak konsolda yazılan komutları dinler. API işlevi, komut adı için bir dize, garip bir 'InputArgument' türü ve kısıtlı adında bir bool ister. Kısıtlı genellikle yanlıştır ve girdi argümanı, komut geçildiğinde yürütmemiz için bir temsilci olarak hareket edecektir. Buradaki soru, bu geri arama ile hangi argümanların iletildiğidir. Görünüşe göre bunlar <int, List. string> int kaynak olduğunda, List gerçekte parametre dizelerinin bir listesidir ve son dize tüm komuttur.
C#:
// ... fyi: This function works in the constructor of the server BaseScript.
API.RegisterCommand("say", new Action<int, List<object>, string>((source, arguments, raw) =>
{
Debug.WriteLine($"{source}\n{raw}");
foreach (var arg in arguments)
Debug.WriteLine($" {arg}");
}), false);
// Console command: say hello world!
// Debug:
// 0,
// say hello world!
// hello
// world!