Resource:IT/Map manager: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
(→‎A simple tutorial: Tradotta la sezione)
m (Redirected page to IT/Resource:Mapmanager)
Tag: New redirect
 
(7 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{IT/MainP}}
#REDIRECT [[IT/Resource:Mapmanager]]
{{IT/Risorsa}}
Il '''map manager''' è una risorsa inclusa nel pacchetto server di MTA:SA DM e comprende comandi, funzioni ed eventi per le gamemodes per gestire dinamicamente le loro mappe. Ad esempio, quando un server ha bisogno di caricare diverse mappe per una race mode, invece di essere messe tutte nella risorsa della gamemode, possono essere inserite in una risorsa separata ed essere successivamente richiamate con la funzione "changeGamemodeMap" quando una nuova gara inizia.
 
Più specificamente, il map manager memorizza la lista di tutte le gamemodes/mappe e ne gestisce il caricamento; applica alcune impostazioni della mappa che hanno effetto sul mondo del gioco e setta le regole della mappa e il tipo di gioco su ASE. Comprende inoltre una funzione che visualizza ed aggiorna automaticamente nel browser la mode/mappa.
 
==Un semplice tutorial==
In questa sezione continueremo a lavorare sulla gamemode che abbiamo creato nella pagina [[IT/Introduzione_allo_scripting|introduzione allo Scripting]]. Aggiungeremo una semplice risorsa mappa che conterrà gli spawn dei giocatori e caricherà i dati nello script principale quando un giocatore dovrà spawnare.
 
Innanzitutto crea una cartella sotto <syntaxhighlight lang="lua"><SERVER>/mods/deathmatch/resources/</syntaxhighlight>, che chiamerai '''mymap'''. Dentro <syntaxhighlight lang="lua">/mymap/</syntaxhighlight> crea un file di testo chiamato '''meta.xml''', che è necessario a tutte le risorse.
 
Inserisci questo codice all'interno di ''meta.xml'':
<syntaxhighlight lang="xml">
<meta>
  <info type="map" gamemodes="myserver"/>
  <map src="mymap.map"/>
</meta>
</syntaxhighlight>
Notare che questa risorsa è collegata allo script principale tramite l'attributo <syntaxhighlight lang="lua">gamemodes=""</syntaxhighlight>, che contiene il nome della risorsa principale. Nel tag <syntaxhighlight lang="lua">map</syntaxhighlight> è indicato il nome del file .map che contiene le informazioni sulla mappa.
 
Ora crea un altro file di testo sotto <syntaxhighlight lang="lua">/mymap/</syntaxhighlight> e chiamalo '''mymap.map''', inserendovi questo codice:
<syntaxhighlight lang="xml">
<map>
  <spawnpoint id="spawnpoint1" posX="1959.5487060547" posY="-1714.4613037109" posZ="18" rot="63.350006103516" model="0"/>
</map>
</syntaxhighlight>
Notare che <syntaxhighlight lang="lua">spawnpoint</syntaxhighlight> è il tipo di elemento usato nella funzione [[IT/getElementsByType|getElementsByType]]; così come <syntaxhighlight lang="lua">id</syntaxhighlight> è usato nella funzione [[IT/getElementByID|getElementByID]].
 
Per caricare i dati della mappa lo script principale ha bisogno di un collegamento con la risorsa della mappa. Modifichiamo il file '''script.lua''' nella risorsa <syntaxhighlight lang="lua">myserver</syntaxhighlight>. Inserisci il seguente codice:
 
<syntaxhighlight lang="lua">
function loadMap(startedMap)
mapRoot = getResourceRootElement(startedMap)
end
 
addEventHandler("onGamemodeMapStart", g_root, loadMap)
</syntaxhighlight>
In pratica, l'evento <syntaxhighlight lang="lua">onGamemodeMapStart</syntaxhighlight> ci da l'handle della mappa ("startedMap"), che abbiamo usato per estrarre l'handle della risorsa contenente la mappa ("mapRoot").
 
Con l'handle della risorsa possiamo estrarne le informazioni sugli spawnpoint. Creando la funzione <syntaxhighlight lang="lua">joinHandler()</syntaxhighlight> dentro '''script.lua''', invece di specificare le coordinate '''x''', '''y''' e '''z''', possiamo usare i dati della mappa come segue:
<syntaxhighlight lang="lua">
function joinHandler()
local spawn = getElementsByType("spawnpoint", mapRoot) --Creiamo un array locale contenente gli elementi <spawnpoint>
local x,y,z,r --Creaiamo delle variabili locali per tutte le coordinate
for key, value in pairs(spawn) do --Inseriamo nelle variabili delle coordinate le coordinate prese dall'elemento <spawnpoint>
x = getElementData(value, "posX")
y = getElementData(value, "posY")
z = getElementData(value, "posZ")
r = getElementData(value, "rot")
end
spawnPlayer(source, x, y, z) --Spawniamo il giocatore alle coordinate appena prese
fadeCamera(source, true) --E impostiamo la sua telecamera su di lui
end
</syntaxhighlight>
Ora puoi far partire la gamemode sul tuo server avviando in console il seguente comando:
<syntaxhighlight lang="lua">gamemode myserver mymap</syntaxhighlight>
 
==A more advanced tutorial==
In this tutorial, instead of starting the map while starting the server with the command above, we'll start the map resource with a few lines of script. This is useful when you have multiple maps and would like to let the server start them automatically.
 
First of all we need to add a new event handler for [[onResourceStart]] event, which is fired when the main script is started manually with the ''gamemode'' command. Then in the function binded to the event, we'll load the map resource and start the map:
<syntaxhighlight lang="lua">
function Initialize(startedResource)
mapRes = getResourceFromName("mymap")
manager = getResourceFromName("mapmanager")
startResource(mapRes)
call(manager, "changeGamemodeMap", mapRes, getThisResource())
end
 
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), Initialize)
</syntaxhighlight>
The [[call]] function lets you use a function defined in another resource, which is the "changeGamemodeMap" function in the "mapmanager" resource in our case.
 
If you try to run the server now, it will give you several "access denied" errors. That's because the main resource, "myserver", doesn't yet have access to the function [[startResource]] by default. We must add the resource in the Access Control List with appropriate rights.
 
Go to /Your MTA Server/mods/deathmatch/ directory. You will see a file named acl.xml. Open it with Notepad, and insert the following codes:
<syntaxhighlight lang="xml">
<group name="myserver">
  <acl name="acl_myserver"/>
  <object name="resource.myserver"/>
</group>
<acl name="acl_myserver">
  <right name="function.startResource" access="true"/>
  <right name="function.stopResource" access="true"/>
  <right name="function.restartResource" access="true"/>
</acl>
</syntaxhighlight>
Make sure the acl.xml file is closed, then restart the server process. It will reload the ACL settings and give your resource access to the function. Now you can start the gamemode with:
 
'''gamemode myserver'''
 
And the script will automatically load the map for you.
 
==Usage==
To use the map manager, your resources must first be marked as either gamemodes or maps.
 
You have to tag the '''gamemode resource''' with the correct type in its info tag:
<syntaxhighlight lang="xml"><info description="A gamemode" type="gamemode" /></syntaxhighlight>
 
'''Map resources''' also need the ''type="map"'' tag, plus a ''gamemodes'' tag listing the gamemode resources they're compatible with in a comma-separated list ''without spaces''.
<syntaxhighlight lang="xml"><info description="A gamemode map" type="map" gamemodes="ctv,koth" /></syntaxhighlight>
 
There can be only one gamemode and one gamemode map loaded at once.
 
==Optional resource attributes==
These attributes all go in the corresponding resource's info tag.
 
'''name:''' A friendly name for your gamemode or map, to be displayed in the start messages or map listings instead of the filename.
 
==Commands==
'''changemap newmap [newgamemode]''' (changes the gamemode map to a new one, optionally changing the gamemode as well)
 
'''changemode newgamemode [newmap]''' (changes to a new gamemode, optionally starting a map with it)
 
'''gamemode newgamemode [newmap]''' (same as previous one)
 
'''stopmode''' (stops the current mode and mode map)
 
'''stopmap''' (stops the current mode map)
 
'''maps [gamemode]''' (lists all maps in the server, optionally all maps compatible with a gamemode)
 
'''gamemodes''' (lists all gamemodes)
 
==Settings==
'''*mapmanager.color''' [hex color string] (changes the mapmanager's output messages' color) (default: #E1AA5A)
 
'''*mapmanager.messages''' [boolean] (whether map/gm changes are enabled) (default: true)
 
'''*mapmanager.ASE''' [boolean] (whether the manager will set ASE gametype / mapname) (default: true)
 
==Exported functions==
<syntaxhighlight lang="lua">bool changeGamemode ( resource newGamemode, [ resource mapToLoadWith ] )</syntaxhighlight>
Changes the gamemode to a new one, optionally specifying an initial map for it (will load without a map by default).
<syntaxhighlight lang="lua">bool changeGamemodeMap ( resource newMap, [ resource gamemodeToChangeTo ] )</syntaxhighlight>
Changes the GM map to a new one, optionally specifying a gamemode to change to before loading it (will load with the current gamemode by default).
<syntaxhighlight lang="lua">table getGamemodes ( )</syntaxhighlight>
Returns a table of all gamemode resource pointers.
<syntaxhighlight lang="lua">table getGamemodesCompatibleWithMap ( resource theMap )</syntaxhighlight>
Returns a table of compatible gamemode resource pointers.
<syntaxhighlight lang="lua">table getMaps ( )</syntaxhighlight>
Returns a table of all map resource pointers.
<syntaxhighlight lang="lua">table getMapsCompatibleWithGamemode ( [ resource theGamemode ] )</syntaxhighlight>
Returns a table of compatible map resource pointers. If the gamemode is left blank, it returns all maps which aren't compatible with any gamemode.
<syntaxhighlight lang="lua">resource getRunningGamemode ( )</syntaxhighlight>
Returns the currently running gamemode's resource pointer.
<syntaxhighlight lang="lua">resource getRunningGamemodeMap ( )</syntaxhighlight>
Returns the currently running GM map's resource pointer.
<syntaxhighlight lang="lua">bool isGamemode ( resource theGamemode )</syntaxhighlight>
Determines if a resource is a gamemode or not.
<syntaxhighlight lang="lua">bool isGamemodeCompatibleWithMap ( resource theGamemode, resource theMap )</syntaxhighlight>
Determines if a gamemode is compatible with a map or not.
<syntaxhighlight lang="lua">bool isMap ( resource theMap )</syntaxhighlight>
Determines if a resource is a map or not.
<syntaxhighlight lang="lua">bool isMapCompatibleWithGamemode ( resource theMap, resource theGamemode )</syntaxhighlight>
Determines if a map is compatible with a gamemode or not.
<syntaxhighlight lang="lua">bool stopGamemode ( )</syntaxhighlight>
Stops the current gamemode and its map.
<syntaxhighlight lang="lua">bool stopGamemodeMap ( )</syntaxhighlight>
Stop the current GM map.
Determines if a map is compatible with a gamemode or not.
 
==Fired events==
''(For all these events, "source" is the resource's root element.)''
<syntaxhighlight lang="lua">onGamemodeStart ( resource startedGamemode )</syntaxhighlight>
Fired before a gamemode starts.
<syntaxhighlight lang="lua">onGamemodeStop ( resource stoppedGamemode )</syntaxhighlight>
Fired before a gamemode is stopped.
<syntaxhighlight lang="lua">onGamemodeMapStart ( resource startedMap )</syntaxhighlight>
Fired before a GM map starts.
<syntaxhighlight lang="lua">onGamemodeMapStop ( resource stoppedMap )</syntaxhighlight>
Fired before a GM map is stopped.
 
==Supported map settings==
The following settings from the [[settings system|registry]] are applied by the map manager when a map is started:
<br>'''gamespeed''' [number]: The map's game speed.
<br>'''gravity''' [number]: The map's gravity.
<br>'''time''' [string of the form '''hh:mm''']: The map's time.
<br>'''weather''' [number]: The map's weather ID.
<br>'''waveheight''' [number]: The map's wave height.
<br>'''locked_time''' [boolean]: Whether the set time will be frozen by the manager or not.
<br>'''minplayers''' [number]: The required minimum number of players to start the map.
<br>'''maxplayers''' [number]: The allowed maximum number of players to start the map.

Latest revision as of 11:40, 11 June 2023