De ontwikkelingsplugin - Blu -Dev/Smashline GitHub Wiki (2024)

Het probleem

Het is een groot understatement om te zeggen dat Ultimate geen lichtgewicht spel is, vooral bij het opstarten.Een enkele iteratie voor uw codemod moet talloze stappen doorlopen:

  1. Merk op dat er een probleem is met de huidige implementatie.
  2. Zoek uit wat dat probleem is en waar het in de code is en verander het vervolgens.
  3. Recompileer de plug -in, bevestig fouten en verzendt deze terug naar de schakelaar.
  4. Sluiting en heropening Smash.Afhankelijk van hoeveel plug -ins u hebt en hoeveel mods, kan dit durenminuten.
  5. Ga naar de trainingsmodus of een match en test om te zien of het probleem is opgelost.

Deze iteratietijd kan erg lang worden en is behoorlijk ontmoedigend terwijl je probeert je mod te verfijnen/in evenwicht te brengen.

De oplossing

De oplossing van Smashline hiervoor is om ondersteuning op te nemen voor wat ik een "ontwikkelingsplugin" noem.De ontwikkelingsplug -in verschilt op een paar manieren van de gemiddelde skyline -plug -in:

  • skyline_mainwordt ongebruikt, omdat skyline niet de lader van de plug -in is
  • Ze zijn allebei geïnstalleerd en hebben het potentieel om tijdens runtime te worden verwijderd
  • Er kan er maar één voor één zijn

De ontwikkelingsplug -in is geladenROM: /Smashline/Development.nroen wordt verondersteld te bevatten welke mods momenteel worden ontwikkeld.Het is vereist om te exporterensmashline_install, die door Smashline wordt genoemd om de mods voor uw plug -in te installeren.Ze kunnen ook optioneel exporterensmashline_uninstall, die kan worden gebruikt om elke "opruiming" uit te voeren die de plug -in moet doen, zoals het bevrijden van dynamisch geheugen.

Smashline verwijdert automatisch elk ACMD-script, het statusscript, eenmaal per frameBel terugen Agent Reset Callback die wijst op een functie in de ontwikkelingsplug -in wanneer deze wordt gelost.

De ontwikkelingsplug -in gebruiken

Er zijn een paar richtlijnen als het gaat om het ontwikkelen van een mod en het gebruik van de ontwikkelingsplug -in om dit te doen.

  • Geen soort functiehaak (skyline hooks, smashline hooks, enz.) Moeten worden gebruikt vanuit de ontwikkelingsplug -in.Als de plug -in tijdens runtime opnieuw wordt geladen (het hele punt hiervan), zijn de referenties naar afvaladressen en zullen crashes veroorzaken.Als u een functie moet aansluiten, zie de onderstaande secties.
  • Om dezelfde reden zijn functiehaken niet toegestaan, gemeenschappelijke statusvervangingen zijn niet toegestaanalsZe bieden ook een symbool om te haken.
  • Eenmaal per per-agent-framevervangingmag niet worden gebruikt.Ze zijn sneller, omdat er geen iteratie of vergrendeling van mutexen is, maar ze werken ook vergelijkbaar met functiehaken en kunnen niet worden gebruikt.Gebruik in plaats daarvan de callbacks van eenmaal per per-agent-frame die elders in de wiki wordt uitgelegd.

Zorg ervoor dat u uw plug -in naar de juiste locatie kunt sturenlading((Cargo Installeer vrachtkastje) en bouw uw plug -in met de volgende opdracht

Cargo Skyline Install-Install-Path Rom: /Smashline/Development.nro

Hiermee wordt uw plug -in op de juiste locatie gebouwd/geïnstalleerd voor Smashline om te lezen.Druk op om de plug -in tijdens runtime opnieuw te ladenL + r + dpad omhoog

Als u in de war bent, kijk dandeze videoHieronder waar ik de ontwikkelingsplug -in demonstreer.

Werken rond beperkingen

Deze beperkingen zijn jammer, ik zal toegeven.Een deel van de reden dat dit soort ontwikkelingsoptie nog niet beschikbaar is gesteld, is vanwege deze beperkingen.Het is moeilijk om te bewaken wat mensen doen om te voorkomen dat ze moeilijk om insecten te traceren te traceren.In dit geval geloof ik echter dat de voordelen veel opwegen tegen de kosten.Hoewel ik je niet kan voorbereiden op elk scenario, zal ik enkele oplossingen bieden voor degenen die grotere mods ontwikkelen.

Ouder- en onderliggende plug -ins

Dit is een belangrijk concept voor de andere secties, dus luister!

In dit geval is een "ouder" -plug -in een plug -in die is geïnstalleerd via skyline, wat betekent dat deze is geïnstalleerd en beschikbaar is voor de levensduur van de software.Dit betekent dat het een veilige plek is om uw haken, zowel skyline als smashline -stijl te installeren, en ook om uw statische variabelen/andere belangrijke items op te slaan.

De plug -in "Child" wordt de ontwikkelingsplug -in.Deze plug -in zou alleen moeten weten wat de ouder het vertelt.Als de bovenliggende plug -in een functie haakt, stuur dan de belangrijke informatie naar de kinderplug -in.Ik weet dat dit eenvoudig klinkt, maar het is de kern van hoe te werken om de beperkingen die afkomstig zijn van niet-statische levenslange plug-ins.

Omgaan met functiehaken

Het omgaan met functiehaken is vrij eenvoudig en er zijn een paar manieren om het te doen.Een daarvan is al geïmplementeerd in plug -ins zoalslibnro_hook.nroEnzelfs libsmashline_hook.nro(gek, ik weet het).Deze methode gebruikt callbacks.Omdat u nu verwijderbare callbacks nodig hebt, is een optie om deze callbacks te implementeren alsof er maar één plug -in is die ze zal gebruiken:

// Dit staat in de bovenliggende pluginuse Smash :: app :: BattleObjectModuleAccessor; type getintcallback = fn (boma: *mut battleObjectModuleAccessor, wat: i32, waarde: i32); static mut child_function: optie  = geen;:: hook (vervang = workmodule_get_int)] onveilig fn get_int_hook (boma: *mut battleObjectModuleAccessor, wat: i32) -> i32 {let value = origineel! () (boma, wat);als het een aantal (child_func) = child_function.as_ref () {child_func (boma, wat, waarde) laat;} waarde}#[no_mangle] pub extern "rust" set_child_function (child: optie ) {onveilig {child_function = child;}} // Dit staat in de Child PlugInuse Smash :: App :: BattleObjectModuleAccessor; Type getintCallback = fn (Boma: *Mut BattleObjectModuleAccessor, wat: i32, waarde: i32); externe "rust" {fn set_child_functie (kind: kind: kind: kind: kind: kind: kind: kind: kind: Kind: Kind: Child: Child: Child: Child: Child: Child: Child: Child: Child: Kind:Getintcallback>);} fn get_int_hook (boma: *mut battleObjectModuleAccessor, wat: i32, waarde: i32) {println! ("Workmodule :: get_int roept voor {: #x}: {: #x}", wat, wat, waarde);}#[Smashline :: Installer] pub fn install () {set_child_function (some (get_int_hook));}#[smashline :: uninstaller] pub fn uninstall () {set_child_function (geen);};

Statische variabelen

Helaas hebben de meeste mod -ontwikkelaars niet de tools om te repliceren wat de game -ontwikkelaars doen om toegang te krijgen tot variabelen tussen meerdere scripts zonder het gebruik van statische variabelen.Dit is in de meeste mods een nietje geworden om langdurige informatie op te slaan.Aangezien deze informatie alleen maar duurt als de plug -in is geladen, is dit niet het beste idee om deze variabelen in de plug -in van het onderliggende onderlichting op te slaan.Er is een eenvoudige, zij het ietwat irritante oplossing hiervoor: gebruik Gettter- en Setter -functies.

// Dit is de bovenliggende plugInuse Smash :: App :: BattleObjectModuleAccessor; Mod Mario {pub static mut is_large: [bool;8] = [onwaar;8];} mod Snake {pub static mut granades_out: [i32;8] = [0;8];pub static mut jab_used_frame: [f32;8] = [0.0;8];pub static mut last_damage_dealt: [f32;8] = [0.0;8];} PUB ENUM GlobalVariables {Mario_islarge, Snake_GrenadesOut, Snake_JabusedFrame, Snake_lastDamageageAlt}#[No_mangle] Pub unsafe externe "Rust" Fn get_int (Boma: *mut battleObjectModuleAccessor, welke: GlobalVariabables) -> i32 {i32 {i32 id = WorkModule :: Get_Tint(Boma, *Fighter_Instance_Work_ID_Int_Entry_id);Match welke {Snake_Grenadesout => Snake :: Grenades_out [id], _ => 0}}#[no_mangle] Pub onveilige externe "roest" fn set_float (boma: *mut battleObjectModuleAccessor, welke: globalvariables, waarde: f32) {let id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id id il= Workmodule :: get_int (boma, *fighter_instance_work_id_int_entry_id);Match welke {Snake_jabusedFrame => Snake :: Jab_used_frame [id], Snake_lastDamagealT => Snake :: Last_damage_dealt [id], _ => 0.0}}

Dit is slechts een manier om met statische variabelen om te gaan, ik weet zeker dat er betere en creatievere manieren zijn om ermee om te gaan

Andere problemen

Er zijn zeker andere kwesties die ik niet had voorspeld bij het ontwikkelen van dit hulpprogramma.Mijn excuses als iets "onmogelijk" lijkt te doen met een ontwikkelingsplug -in, of als onverwachte dingen crashen.Dit is geen perfect systeem, maar is ontworpen om nuttig te zijn bij het ontwikkelen van coole mods zonder weg te verspillen aan het smash -laadscherm :)

De ontwikkelingsplugin - Blu -Dev/Smashline GitHub Wiki (2024)
Top Articles
Latest Posts
Article information

Author: Margart Wisoky

Last Updated:

Views: 5889

Rating: 4.8 / 5 (78 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Margart Wisoky

Birthday: 1993-05-13

Address: 2113 Abernathy Knoll, New Tamerafurt, CT 66893-2169

Phone: +25815234346805

Job: Central Developer

Hobby: Machining, Pottery, Rafting, Cosplaying, Jogging, Taekwondo, Scouting

Introduction: My name is Margart Wisoky, I am a gorgeous, shiny, successful, beautiful, adventurous, excited, pleasant person who loves writing and wants to share my knowledge and understanding with you.