Salve a tutti sono Assassin_me oggi voglio farvi conoscere un programma molto utile per creare un Server SAMP il suo nome è: PAWNO per chi non lo conoscesse PAWNO e un compilatore in grado di creare e modificare una GM (GameMode)Per essere semplici, una gamemode "ben fatta" è una gamemode che utilizza appieno le potenzialità delle mappe (.map) di MTA; vale a dire che la gamemode non contiene elementi specifici delle mappe(pickups, oggetti, spawns, veicoli eccetera)hardcodati al loro interno. Questi elementi vanno invece inseriti nelle mappe di MTA(.map) che verranno poi caricate dagli scripts. In questo modo possono essere caricate mappe diverse per la stessa gamemode, o è anche possibile creare delle mappe grazie al map editor di MTA. Un ovvio esempio di una gamemode "ben fatta" è MTA:Race: permette ai giocatori di caricare mappe personalizzate(i file .map). Non c'è bisogno di modificare la gamemode stessa per cambiare gli spawnpoints, i veicoli, eccetera.
Files mappa
Tecnicamente, i file mappa non sono altro che documenti XML con estensione .map; definiscono le basi di gioco di una o più gamemodes, anche se non possono cambiare le "regole del gioco", essendo queste definite dalla gamemode(.lua).
Ogni elemento nel gioco corrisponde ad un nodo nel file .map. C'è una sintassi predefinita per elementi quali oggetti, veicoli eccetera; comunque, per elementi "speciali" delle tue gamemodes, dovrai creare tu una sintassi apposita.
Esempio
Per il nostro esempio, prendiamo in esame la gamemode Capture the Flag. Una mappa per questa gamemode deve sostanzialmente definire gli spawnpoints dei giocatori e la posizione delle bandiere, ed eventualmente la presenza di altri oggetti come i veicoli o i pickups. Un file .map molto semplificato apparirebbe così:
CODICE
<map>
<spawnpoint id="spawnpoint1" posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" rot="63.350006103516" model="0"/>
<pickup id="Armor 1" posX="1911.083984375" posY="-1658.8798828125" posZ="885.40216064453" type="armor" health="50" respawn="60000"/>
<flag posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" team="blue" />
...
</map>
Qui possiamo vedere due elementi di MTA: uno spawnpoint ed un pickup. Ancora più importante, questa mappa ha un nodo chiamato flag che definisce la posizione ed il colore della bandiera. Gli spawnpoints ed i pickups possono essere gestiti da risorse esterne, ma gli elementi personalizzati devono essere processati dalle gamemodes.
Insomma, vogliamo che i giocatori possano creare le proprie mappe senza aver bisogno dello script LUA.
Esempio: come ottenere le informazioni dal file .map
Come detto prima, la tua mode ha bisogno di ritrovare gli elementi personalizzati definiti in un file .map e processarli. Questo è abbastanza facile, come è dimostrato qui sotto.
-- crea una tabella con tutti gli elementi di tipo flagCODICE
local flagElements = getElementsByType ( "flag" )
-- crea un ciclo per ogni elemento che abbiamo trovatoCODICE
for key, value in pairs(flagElements) do
-- ottiene le info di quell'elementoCODICE
local posX = getElementData ( value, "posX" )
local posY = getElementData ( value, "posY" )
local posZ = getElementData ( value, "posZ" )
local team = getElementData ( value, "team" )
-- crea un oggetto a seconda della posizione della bandiera (flag)
createObject ( 1337, posX, posY, posZ )
-- scrive in chat il team per cui abbiamo creato una base
outputChatBox ( "Base creata per il team ".. team .."!" )
end
La funzione
getElementsByType restituisce una tabella contenente tutti gli elementi di un dato tipo (il tipo corrisponde al nome del nodo [nell'esempio "flag"] nel file .map). Questo funziona sia per i tipi personalizzati sia per quelli di default di MTA (come "vehicle" o "player"). getElementData è usato per ritrovare gli attributi impostati nell'XML. In questi semplice esempio, un oggetto è creato nella posizione della bandiera e un messaggio viene inviato in cheatbox. In realtà, bisognerà fare ovviamente del lavoro in più durante il caricamento della mappa, come in questo caso creare delle forme di collisione per determinare quando un player cattura la bandiera.
Il map manager
Dopo aver letto la sezione di sopra dovrebbe essere chiaro che una gamemode consiste di due parti: La resource della gamemode, che resta sempre uguale
Molte resource delle mappe, che forniscono alla gamemode informazioni legate alla mappa
Ora, al posto di scrivere uno script che carichi la mappa per ogni gamemode, il Map manager fornisce funzioni per caricare le gamemodes e le mappe. Semplicemente, quando digiti il comando giusto (per esempio 'gamemode ctf ctf-italy') avvierà le due resource 'ctf' e 'ctf-italy', chiamando anche l'evento 'onGamemodeMapStart' per avvertire la resource 'ctf' che una mappa è stata caricata. La resource 'ctf' può quindi accedere alle informazioni contenute in 'ctf-italy' e iniziare a spawnare i players, etc.
Come usare il map manager
Per usare questa feature, la tua gamemode deve essere taggata di conseguenza. In maniera più specifica, dovremo impostare, nel meta.xml, l'attributo "type" della tag <info> a "gamemode". Inoltre, possiamo impostare per l'attributo "name" un nome più 'familiare' (come "Capture the flag") che verrà mostrato nel server browser al posto del nome della resource.<!-- meta.xml della gamemode "cowcatapult" -->
<meta>
<info type="gamemode" name="Cow catapulting 2.0"/>
</meta>
[/CODE]
Se la tua gamemode dovrà caricare mappe personalizzate, dovranno essere presenti gli event handlers perCODICE
onGamemodeMapStart
onGamemodeMapStop (se necessario)
Questi eventi vengono chiamati quando una mappa per la tua gamemode viene avviata o chiusa, e passano la reource della mappa come paramentro. All'interno della funzione legata a questi eventi potrai ottenere tutte le informazioni che ti servono dai file della mappa.
Esempio:
CODICE
function startCtfMap( startedMap ) -- startedMap è la mappa appena avviata
local mapRoot = getResourceRootElement( startedMap ) -- ottiene il nodo di root della mappa avviata
local flagElements = getElementsByType ( "flag" , mapRoot ) -- ottiene tutte le bandiere della mappa e le salva in una tabella
-- continua a caricare informazioni come sopra
-- spawna i players etc.
end
addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap)
Rendere le mappe compatibiliLe mappe sono resource separate. Questo è stato fatto perché creare una nuova mappa non implichi nessuna modifica nella gamemode, e viceversa.
Per rendere una mappa compatibile con la tua gamemode, apri il suo file meta.xml e modificalo così: l'attributo "type" dev'essere settato a "map", e l'attributo"gamemodes" dev'essere una lista senza spazi, in cui gli elementi sono i nomi delle gamemode con cui la mappa funziona, separati da virgole.
CODICE
<!--meta.xml della mappa-->
<meta>
<info type="map" gamemodes="cowcatapult,assault,tdm"/>
</meta>
Quando tutto è pronto, gli admin potranno usare questi due comandi per avviare/fermare le gamemode: /gamemode nomeGamemode [nomeMappa] (nomeMappa è opzionale: puoi selezionare una mappa con cui iniziare la gamemode, di default questo parametro è vuoto)
/changemap nomeMappa [nomeGamemode] (nomeGamemode è opzionale: seleziona la gamemode da avviare con la mappa, di default è quella corrente)
Il Map manager esporta qualche altra funzione che in questo esempio non serve, ma che potrebbe essere utile.
Il sito per convertire le mappe è questo:
www.convertffs.comGrazie a tutti per la visione e ricordatevi di arrularvi nel clan fws....