Membuat deathmatch dasar
Membuat deatchmatch dasar dalam PAWN tidak bisa sederhana. Buka hanya Pawno (Lihat Editor Scripting ) dan klik New. Di sana Anda memilikinya, naskah pertama Anda. Untuk menjalankannya pertama menyimpannya (kebanyakan orang menyimpannya untuk "<San Andreas Instal directory> / Samp / gamemodes / src /" tapi lebih mudah (untuk pengujian lokal) untuk menyimpannya ke "<SA> / Samp / gamemodes /" ), kemudian klik tombol pada toolbar di sebelah kiri langsung dari tombol panah biru. Hal ini akan mengkompilasi file Pwn. Anda ke AMX dalam folder yang sama., Namun untuk permainan melihatnya itu perlu di "<SA> / Samp / gamemodes /" (melihat mengapa tabungan ada lebih mudah, yang membuatnya sudah ada setelah kompilasi). Sekarang untuk menguji peta Anda, Anda perlu akan menyiapkan Server lokal dan Ubah ke mode Anda (ketik "changemode <your name> mode" pada jendela Server).
Jika semua yang bekerja, ketika Anda terhubung ke server Anda melalui
klien sa-mp dan permainan dimulai Anda akan muncul di luar sebuah kasino
di Las Venturas.
Sayangnya, anda tidak akan dapat melihat karakter Anda memilih (saat
ini hanya ada satu) tetapi kita dapat dengan mudah mengubah itu nanti.
Hal ini juga tidak deathmatch sangat menarik karena Anda hanya memiliki
tinju untuk bertarung dengan dan tidak ada lawan, tapi karena ini
adalah server lokal ada saat ini tidak banyak yang bisa kita lakukan
tentang masalah kedua.
Sekarang hal pertama Anda mungkin ingin menambahkan ke mode Anda adalah senjata, ini dikendalikan pada "per kelas" dasar. Setiap pemain Anda harus memilih dari pada awal permainan (atau nanti jika Anda mengubah) disebut pemain "kelas". Mereka semua mungkin memiliki senjata yang sama atau semua yang berbeda, atau kombinasi keduanya.
Anda mengatur setiap kelas senjata secara terpisah, sehingga untuk
membuat mereka semua memiliki senjata yang sama Anda hanya akan menyalin
data senjata dan menambahkannya ke masing-masing kelas, ini akan
menjamin pertandingan yang seimbang tapi tidak terlalu menarik, namun
itu adalah terserah Anda. Dalam pencarian editor baris ini:
AddPlayerClass (0, 1958,3783, 1343,1572, 15,3746, 269,1425, 0, 0, 0, 0, 0, 0);
Ini adalah definisi kelas, parameter adalah sebagai berikut:
AddPlayerClass (Pemain Model, X, Y, Z, A, 0 Senjata, Amunisi 0, 1 Senjata, Amunisi 1, 2 Senjata, Amunisi 2);
Model Pemain bisa didapat dari "peds.ide", "X", "Y" dan "Z" adalah koordinat di mana pemain akan menelurkan saat dipilih dan "A"
adalah sudut menghadap mereka, ada satu titik spawn per kelas, namun
hal ini bisa mendapat sekitar dengan coding yang akan dibahas kemudian. Angka-angka dapat Senjata ditemukan di sini dan jumlah amunisi hanya jumlah amunisi yang ingin Anda Berikan Pemain per Weapon (Melee Senjata amunisi selalu 0).
Sekarang salin baris ini:
AddPlayerClass (102, 1958,3783, 1343,1572, 15,3746, 269,1425, 5, 0, 22, 100, 32, 50);
dan menempatkannya di bawah garis Anda temukan dalam naskah Anda.
Anda sekarang akan memiliki ingame pilihan antara CJ dengan apa-apa dan
Balla dengan tongkat baseball, pistol dan Tec9, jika Anda ingin bahkan
hal ini mencoba menambahkan senjata Anda sendiri untuk CJ atau
menambahkan kelas pemain yang lebih di bawah ini dengan senjata lainnya. Catatan: senjata yang tercantum pada halaman terkait di atas yang mengatakan "(crash jika Anda mencoba untuk api)" atau "(Tidak Dapat Digunakan)" tidak bekerja dengan SA-MP baik.
Mendapatkan koordinat, sudut dan Model id
Anda mungkin akan ingin memindahkan beberapa poin bibit Anda tentang
sehingga semua orang tidak bertelur di tempat yang sama, yang akan
membuat deathmatch agak membosankan dan berkemah luar biasa mudah. Di sinilah modus debug masuk Jalankan "samp_debug.exe" dalam direktori root San Andreas Anda dan setiap kali Anda ingin menyimpan tipe koordinasi "/ save" dalam permainan (tekan "t" atau tombol di bawah melarikan diri untuk membuka teks / chatting prompt). Ini akan menyimpan posisi Anda saat ini, sudut dan playerid ke sebuah file yang bernama "savedpositions.txt" dalam direktori root SA Anda.
Pengenalan fungsi dan callback
Sebelum kita bisa terus Anda akan perlu diperkenalkan kepada callback. Ini adalah potongan kode yang sudah di gamemode Anda yang terlihat seperti ini:
Public OnPlayerDisconnect (playerid)
{
printf ("OnPlayerDisconnect (% D)", playerid);
kembali 1;
}
Ini adalah callback OnPlayerDisconnect, itu berarti bagian kode
dijalankan oleh server setiap kali terputus pemain, jadi jika Anda ingin
menampilkan pesan di layar besar ketika seorang pemain membuat Anda
akan menempatkan kode untuk itu di sini.
Semua callback penggunaan permainan (kecuali 2, tetapi mereka digunakan
oleh filterscripts, tidak gamemodes dan tidak dibahas di sini) dalam
file Anda, Anda tidak dapat membuat Anda sendiri. Sebagian besar dari mereka muncul sebagai satu di atas tidak, tetapi beberapa (yaitu "OnPlayerCommandText", "OnPlayerRequestClass", "OnGameModeInit" dan "utama"
(yang tidak sepenuhnya callback dan tidak pernah memiliki lebih dari
judul game Anda)) memiliki bit lainnya di sudah, baik untuk membuat
permainan bekerja atau untuk menunjukkan apa yang harus dilakukan di
sana.
Anda juga dapat menggunakan lainnya, blok yang sama (seperti kita
hendak) yang terlihat sama tetapi disebut fungsi, ini harus dipanggil
oleh Anda sendiri. Berikut ini adalah fungsi yang disebut "IMadeThis" (perhatikan kurangnya ruang).
IMadeThis ()
{
/ / Ini adalah komentar dan diabaikan oleh permainan / compiler
/ * Jadi
adalah
ini * /
Print ("Ini Akan Dicetak ke jendela Server");
return 0;
}
Anda mungkin juga telah melihat pengenalan yang sangat cepat untuk komentar di sana, segala sesuatu pada baris setelah "/ /" akan diabaikan, seperti yang akan apapun di manapun di antara "/ *" dan "* /".
Sebagai fungsi tidak disebut oleh permainan kita perlu menyebutnya diri
dari callback, ini mati mudah karena sebagian besar perintah yang Anda
gunakan untuk kode dengan sebenarnya fungsi premade (perintah yang
sebenarnya berbeda), jadi jika Anda ditempatkan :
IMadeThis ();
Anda di OnPlayerDisconnect callback (itu harus Antara "{" dan "}" dan juga sebelum "mengembalikan 1;"
itu akan berjalan dan fungsi yang mencetak pesan di jendela server bila
Anda terputus (mengingat hal-hal lain di sana yang diabaikan). Kami
tidak umumnya ingin mencetak sesuatu ke jendela Server dan semua "print" dan "printf"
fungsi sudah dalam file umumnya dihapus oleh coder. Hanya hal-hal
antara kawat gigi dalam fungsi / callback ( dari sekarang pada fungsi
mengacu pada callback serta mereka adalah kasus khusus dari fungsi),
baris di atas adalah nama fungsi. "publik" berarti fungsi
tersebut dapat dijalankan oleh setiap bit lain dari kode, ini pada
dasarnya berarti kode Anda dapat dijalankan ketika Anda menyebutnya,
kami tidak khawatir tentang fungsi swasta karena mereka umumnya tidak
digunakan dalam SA-MP (jika sama sekali). Kurung setelah nama fungsi
melampirkan daftar parameter, kami belum dibahas ini belum tetapi Anda
dapat melihat contoh penggunaannya di beberapa callback dalam file
kosong Anda, perhatikan bahwa parameter-parameter tersebut otomatis
lolos saat pertandingan panggilan fungsi, jika kita menggunakan fungsi
kustom (yaitu tidak callback) dan kami ingin menggunakan beberapa
parameter kita perlu melewati mereka sendiri.
Satu hal kecil yang harus disebutkan adalah bahwa semua baris selain
baris dengan kawat gigi pada (dan bahkan mereka dalam keadaan tertentu,
tetapi ini akan dibahas kemudian) dan garis langsung sebelum penjepit
terbuka (kawat gigi mungkin pada akhir baris yang atau, seperti yang
ditunjukkan di sini, pada baris baru), diakhiri dengan titik koma untuk
menunjukkan akhir dari suatu proses.
Membuat deathmatch tim
OK, sekarang Anda tahu bagaimana membuat kelas dan menempatkan mereka
kalau kita akan menunjukkan cara untuk mengatur tim, ini akan menjadi
bit pertama dari coding nyata tetapi cukup mudah.
Saya hanya akan menggunakan dua kelas yang dijelaskan pada halaman ini
sehingga jika Anda memiliki lebih menghapusnya untuk saat ini atau mulai
modus baru dan pastikan hanya dua masuk
Kelas diberi nomor dalam urutan dari 0, sehingga kelas pertama dalam
file Anda adalah 0, yang kedua adalah 1 dan seterusnya (komputer dan
program hampir selalu mulai dari 0 dalam penghitungan (Anda akan
menemukan bahwa playerid Anda dalam permainan uji 0) ).
Kami ingin mengatur tim berdasarkan kelas mana yang mereka pilih (baik
Grove atau Balla), Anda mungkin melihat callback dan berpikir bahwa ini
akan pergi dalam fungsi OnPlayerRequestClass, dan Anda akan benar.
Ketika memilih kelas mereka Anda ingin mengatur tim berdasarkan itu,
kita tidak bisa melakukannya dalam fungsi OnPlayerSpawn pada saat itu
kita tidak tahu kelas mereka telah memilih (yang merupakan parameter dan
hanya parameter kita melewati atau yang bersifat global dalam script
Anda (kita akan membahas ini nanti) dapat digunakan dalam fungsi
apapun). Pertama kita perlu mendefinisikan tim kami, di bawah "# include" baris (s) di bagian atas file Anda menambahkan baris ini:
# Tentukan TEAM_GROVE 1
# Tentukan TEAM_BALLA 2
# Menentukan TEAM_GROVE_COLOR 0x00FF00AA / / Terang Hijau (dalam format RGBA)
# Menentukan TEAM_BALLA_COLOR 0xFF00FFAA / / cerah Purple
Jika Anda ingin mengubah warna, itu bagus, hanya ingat bahwa dua digit
terakhir adalah alpha dan rendah yaitu semakin sedikit Anda bisa melihat
warna.
Mendefinisikan adalah murni pengganti, jika Anda pernah ingin
menggunakan nomor 1 dalam naskah Anda, Anda dapat menggunakan TEAM_GROVE
bukan, ini bukan ide yang baik untuk perhitungan normal seperti itu
membuat mereka sulit untuk dibaca, tapi untuk menggunakan untuk
menunjukkan tim, yang hanya dilambangkan dengan angka, itu membuat jauh
lebih jelas apa yang terjadi (dan membuatnya sangat mudah untuk mengubah
tim sekitar atau memodifikasi kemudian sebagai Anda hanya perlu
mengubah 1 dalam menentukan daripada semua contoh itu seluruh kode. .
ketika kode dikompilasi, semua "TEAM_GROVE" s akan digantikan oleh 1, tidak seperti variabel, itu adalah konstan, tidak berubah Sekarang di bawah garis menambahkan:
baru gTeam [MAX_PLAYERS];
Ini disebut array global.
Array pada dasarnya adalah banyak variabel (tempat Anda menyimpan data
untuk membaca dan menulis) mengelompok bersama-sama untuk menyimpan
banyak data sekaligus. The "MAX_PLAYERS" adalah konstanta yang telah ditetapkan (dilakukan dengan cara yang persis sama seperti yang kita lakukan mendefinisikan kami MAX_PLAYERS
sebenarnya ditetapkan sebesar 500 di SA-MP 0.3A., Jadi ini berarti
bahwa array kita dapat menyimpan hingga 500 lembar data . The g pada
nama berarti global, tapi itu tidak membuatnya global yang (itu hanya
membuat lebih mudah untuk mengatakan apa variabel melakukan apa,
mendefinisikan di luar fungsi artinya adalah global dan dapat digunakan
oleh semua fungsi kami. Setiap variabel didefinisikan dalam fungsi
adalah lokal untuk fungsi itu dan tidak dapat memiliki nama yang sama
dengan variabel lain dalam fungsi yang sama atau variabel global (yang
juga mengapa g berguna), namun hal itu dapat memiliki nama yang sama
dengan variabel lain dalam fungsi lain. Semua "playerid"
variabel dalam skrip kosong Anda sebenarnya semua variabel independen,
masing-masing lokal untuk fungsi yang berbeda, namun mereka semua lulus
data yang sama, tapi ingat bahwa setiap fungsi yang Anda buat tidak akan
secara otomatis memiliki . data yang Sekarang kita memiliki yang
mengatur kita dapat mengatur tim:
SetPlayerTeamFromClass (playerid, classid)
{
if (classid == 0)
{
gTeam [playerid] = TEAM_GROVE;
}
lain
{
gTeam [playerid] = TEAM_BALLA;
}
}
Tempatkan kode yang LUAR fungsi dalam kode Anda (seperti fungsi baru)
dan menempatkan garis-garis ini sebagai hal pertama setelah kurung
kurawal buka di callback OnPlayerRequestClass Anda (perhatikan cara
variabel tidak global sehingga kami harus melewati mereka Untuk
fungsinya juga):
SetPlayerTeamFromClass (playerid, classid);
Ini akan menghemat tim pemain untuk array melalui fungsi baru.
Data dalam array direferensikan oleh nomor, sehingga array [0] adalah
item pertama data, array [1] adalah yang kedua dan seterusnya, seperti
kita menggunakan gTeam [playerid], tergantung pada playerid kita lulus
akan menentukan di mana dalam array untuk menyimpan data, sehingga untuk
pemain 5 data mereka akan disimpan di berbagai posisi 5 (ingat, ini
adalah bagian ke-6 data). Sekarang salin fungsi ini:
SetPlayerToTeamColor (playerid)
{
if (gTeam [playerid] == TEAM_GROVE)
{
SetPlayerColor (playerid, TEAM_GROVE_COLOR);
}
else if (gTeam [playerid] == TEAM_BALLA)
{
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
}
}
Dan tambahkan baris berikut ke OnPlayerSpawn:
SetPlayerToTeamColor (playerid);
Kami sekarang memiliki tim kami, tapi apa yang telah kita benar-benar dilakukan?
if (classid == 0)
{
gTeam [playerid] = TEAM_GROVE;
}
Dalam fungsi pertama kami, kami memeriksa kelas mereka memilih (ingat
kita mengatakan bahwa kelas didefinisikan dalam file Anda adalah kelas
0?) "==" Berarti "sama dengan", sebuah equals tunggal
menandatangani hanya menetapkan variabel ke nomor diberikan (seperti
yang terlihat pada baris berikutnya tapi satu).
Kurung kurawal memisahkan fungsi antara mereka dari sisa kode, bit di
sana hanya dijalankan jika kelas yang dipilih adalah 0 (cj), jika tidak,
perintah yang lain datang ke dalam bermain dan mengeksekusi bukan (ini
mengeksekusi setiap kali "jika" perintah salah (yaitu kelas tidak 0)), karena kita hanya memiliki dua kelas untuk memilih dari ini harus berarti kita Balla:
lain
{
gTeam [playerid] = TEAM_BALLA;
}
Kita tidak perlu kembali di sini karena tidak ada data untuk kembali.
Babak kedua mengatur warna pemain ketika mereka bertelur, sehingga Anda dapat memberitahu siapa yang ada di tim mana. Seperti kita diselamatkan tim mereka ke array global, kita masih bisa mengakses data meskipun dalam fungsi yang terpisah.
if (gTeam [playerid] == TEAM_GROVE)
{
SetPlayerColor (playerid, TEAM_GROVE_COLOR);
}
Mudah-mudahan Anda dapat melihat apa ini lakukan sekarang, jika pemain
yang baru saja melahirkan (seperti yang direferensikan oleh playerid) di
TEAM_GROVE, kita mengatur warna mereka untuk TEAM_GROVEs warna.
else if (gTeam [playerid] == TEAM_BALLA)
{
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
}
Bagian berikut ini sedikit berbeda, itu bisa easilly telah dilakukan seperti ini:
lain
{
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
}
Tetapi cara itu dilakukan memungkinkan Anda untuk mengatur warna mereka untuk TEAM_BALLAs warna hanya jika bagian pertama adalah palsu (seperti yang
diurutkan oleh ELSE yang) DAN jika mereka berada di TEAM_BALLA, ini
memungkinkan Anda untuk menambahkan lebih banyak pilihan dengan
menambahkan lebih "else if ( ) "blok sampai akhir sebagai salah satu hanya akan dieksekusi jika semua blok sebelum tidak.
Kendaraan
OK, jika Anda memiliki bab-bab sebelumnya Anda harus memiliki
deathmatch sangat dasar atau tim-deathmatch dengan menumbuhkan
ditempatkan di manapun Anda inginkan, sehingga memungkinkan menambahkan
beberapa kendaraan.
Sebagian besar perintah dalam PAWN melakukan cukup banyak persis
seperti mereka bernama, kita ingin menambahkan kendaraan sehingga
memungkinkan mencari perintah kendaraan:
CreateVehicle ();
AddStaticVehicle ();
Jika Anda mengklik salah satu dari ini dan melihat di status bar (bar
di bagian bawah editor), Anda akan melihat sintaks mereka (informasi apa
/ parameter Anda harus memberikan mereka untuk bekerja):
[A_samp.inc] CreateVehicle asli (vehicletype, Float: x, float: y, Float: z, Float: rotasi, color1, color2, respawn_time);
[A_samp.inc] AddStaticVehicle asli (modelid, Float: spawn_x, Float: spawn_y, Float: spawn_z, Float: z_angle, color1, color2);
Sekarang mereka berdua tampak sama-sama baik, tapi ini adalah di mana
pengetahuan sebelumnya masuk, CreateVehicle hanya menempatkan satu
ingame mobil, AddStaticVehicle menciptakan bibit kendaraan, sehingga
ketika mobil hancur atau desynched itu akan muncul kembali kembali di
mana Anda menempatkan bibit tersebut. Ini perlu dibuat pada awal permainan sehingga Anda akan menempatkan ini dalam Anda "OnGameModeInit ()" callback.
Daftar warna mobil yang tersedia
Angka-angka modelid / vehicletype dapat ditemukan dalam file
vehicles.ide Anda, Mengapung nomor hanya non keseluruhan, pada dasarnya
koordinat dan sudut, dan nomor warna dapat ditemukan dalam file
carcols.dat Anda, mencari nomor referensi untuk warna yang Anda
inginkan, jadi "hitam" adalah "0", "taksi kuning" adalah "6", "currant poli biru" adalah "32" dll, "-1" berarti acak (dari warna default yang mobil, ditemukan lebih rendah pada file carcols.dat). Jika Anda ingin mendapatkan posisi untuk kendaraan, masuk ke mode debug, pilih kendaraan Anda, masuk dan ketik "/ save" kemudian membuka "savedpositions.txt" dan salin baris. Jika Anda ingin menelurkan kendaraan dalam mode debug, ketik "/ v <vehicleid>" ingame dan kendaraan yang akan menelurkan (VehicleID diambil lagi dari vehicles.ide), atau jenis "/ VSEL" untuk membuka layar command kendaraan. Aku punya ini koordinat:
2040.2279, 1344.4127, 11,0, 3,5436
Catatan: ini disebut mengapung, 11.0 adalah pelampung meskipun
keseluruhan, setiap bilangan bulat yang digunakan sebagai pelampung
harus memiliki trailing ".0" untuk menunjukkan sebagai pelampung. Jumlah ini dalam format bahasa Inggris menggunakan titik desimal ("."), Koma digunakan untuk parameter terpisah.
Juga ingat nomor 4 adalah sudut, jadi jika sekarang kita tambahkan
baris berikut ke modus permainan di OnGameModeInit, mengkompilasi ulang
dan uji, kita akan mendapatkan Infernus pink cerah di luar kasino yang
merupakan posisi default bertelur untuk CJ.
Catatan: pada mobil yang menggunakan warna sekunder (seperti mobil
polisi (id 596)) ini akan menjadi merah muda dan mobil biru karena itu
adalah warna sekunder.
AddStaticVehicle (411, 2040,2279, 1344,4127, 10,6719, 3,5436, 126, 54);
Sekarang Anda dapat dengan mudah pergi tentang menyimpan posisi dan
menciptakan mobil sebanyak yang Anda inginkan, sampai batas mesin
didefinisikan dari 2000 mobil individu model apapun. Namun, karena kendaraan secara dinamis mengalir, itu adalah ide yang baik untuk menjaga jumlah model kendaraan di bawah 150.