Как сделать выбор пола pawno

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

Итак, здравствуйте, я начинаю серию уроков про программировании в программе Pawno. Делать мы будем Rp мод, но принципы которые мы изучим помогут вам сделать свой мод на любую тематику. Но не будем тянуть кота за. а начнём.

Итак, сначала разберёмся что-же такое Pawno. Дак вот:

Pawno- это программа для создания и компилирования игрового мода для игры GTA SA-MP. Я думаю для тех, кто уже знаком хотя-бы с каким-то языком программирования будет всё очень хорошо понятно. (Даже HTML).

Итак, заходим в Pawno, а именно в new.pwn именно с него мы будем писать мод.

И разберём что-же мы там видим?
Код:

Чтобы активировать просто уберите //

Далее мы видим:
Код:

это инклуды позднее я поясню для чего они нужны, а пока их лучше не трогать.

это паблики, которые регурируют очерёдность действий вашего будущего мода, а конкретно это выполняется когда вы вкрлючаете серврер
Код:

<>- это скобки открытия и закрытия
return 1-это окончание паблика
;-нужно ставить после окончания строчки обязательно (кроме enum о которых я расскажу позднее)
Код:

И последнее в этом паблике: это печать в консоль сервера

Чуть пониже видим:
Код:

Это то без чего не будет работать мод, это нужно оставить обязательно (текст можно менять)

Я думаю теперь разберём остальные паблики и хватит.

Следующий паблик:
Код:

public OnGameModeInit()
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
>

public OnPlayerRequestClass(playerid, classid)
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
>

public OnPlayerCommandText(playerid, cmdtext[])
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
// Do something here
return 1;
>
return 0;
>

когда игрок вводит команду

теперь это:
Код:

public OnVehicleMod(playerid, vehicleid, componentid)
public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
public OnVehicleRespray(playerid, vehicleid, color1, color2)

если игрок кликнул на игрока в Tab-MENU

Ну и на этом урок закончен, спасибо за внимание, в следующем уроке мы продолжим!


думаю,многие посетители этого сайта и форумов по гта са конкретно, занимаются pwn скриптингом. Раньше я был на онего,это форум pwn скриптинга,но он часто не контачит. Вот я решил сделать эту тему здесь и обсуждать все что с ним связано тоже тут.


вот некоторая полезная информация для начинающих:
как создать детматч:

Нет ничего проще. Открываем Pawno и нажимаем New. Вот он, Ваш первый скрипт. Чтобы запустить его, надо сначала его сохранить (большинство людей сохраняют в директорию "/samp/gamemodes/src/", но будет проще (для локального тестирования) сохранить его в "/samp/gamemodes/"). Затем кликните по кнопке с изображением синей стрелочки. Это действие компилирует Ваш файл .pwn в файл .amx, который появится в том же каталоге, однако чтобы запустить его в игре, этот файл должен лежать в "/samp/gamemodes/" (теперь понятно, зачем было сохранять Ваш скрипт в этом каталоге - теперь не придется ничего никуда переносить в ручную, все уже на своих местах после компиляции). Теперь, чтобы опробовать свой новый мод, Вы должны настроить локальный сервер и сменить игровой режим (наберите "changemode " в окне сервера).


Код:
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);

Это описание класса, параметры в том же порядке:


Код:
AddPlayerClass(Player model, X, Y, Z, A, Weapon 0, Ammo 0, Weapon 1, Ammo 1, Weapon 2, Ammo 2);
Модель персонажа можно взять из файла "peds.ide". "X", "Y" и "Z" – это координаты места появления игрока в игре, после выбора персонажа. "A" – это угол, под которым игрок будет развернут (направление камеры). Есть только одна точка появления для каждого класса, однако это можно обойти с помощью других средств, которые будут рассмотрены позже. Номера оружия можно узнать здесь. А цифры рядом с ammo – это точное количество патронов к каждому оружию, которым будет располагать игрок (у оружия ближнего боя количество патронов всегда 0).
Теперь скопируйте эту строку:


Код:
AddPlayerClass(102, 1958.3783, 1343.1572, 15.3746, 269.1425, 5, 0, 22, 100, 32, 50);

И поместите ее под той, что Вы нашли в Вашем скрипте. Теперь в игре у Вас будет выбор между CJ (без оружия) и Balla (с бейсбольной битой, пистолетом и Tec9). Если хотите, можете сами дать оружие для CJ или добавить больше других классов с другим оружием.

Примечание: некоторое оружие, которое перечислено на странице по ссылке выше, рядом с которым есть пометка "(crashes if you try to fire)" или "(Unusable)" не работает в данной версии SA-MP. В список оружия, которое нельзя использовать, входят и гранаты, однако эта досадность будет исправлена в будущем.

Узнаём координаты, углы и ID моделей

Вам, возможно, захочется изменить координаты появления игроков, чтобы они все не появлялись в одном и том же месте. Если оставить как есть, то ДМ выйдет не самый интересный, а так же это идеальная возможность для кемперства. В этом деле нам поможет Режим Отладки. Запустите "samp_debug.exe" в основном каталоге с игрой и когда бы Вам ни потребовалось, напишите "/save" прямо в игре (для этого нажмите "t" или тильду, чтобы вызвать строку чата). Это действие сохранит Ваше текущее положение в игре (в координатах), угол и ID игрока в файл "savedpositions.txt" в основном каталоге игры SA. Чтобы изменить персонажа в Режиме Отладки нажимайте F11 и F12, переключаясь по кругу между доступными в данном моде моделями.

Знакомство с функциями и callbacks

Прежде, чем мы продолжим, Вы должны узнать, что такое callbacks, или callback`и. Это – массивы кода, внутри Вашего игрового режима, представляющие из себя нечто похожее на следующее:


Код:
public IMadeThis()
// Это однострочный комментарий, он будет проигнорирован

/* Это
многострочный
комментарий */

print("This will be printed to the server window");
return 0;
>Вы, должно быть, обратили внимание на небольшое описание комментариев. Все, что находится в строке за "//" будет игнорироваться. То же будет происходить и с текстом между "/*" и "*/". Так как функция не вызывается игрой, мы должны вызвать ее сами с помощью callback, это смертельно просто, совсем так же, как вы вызываете большинство команд в своем коде. Итак, если вы добавите строку:


Код:
public SetPlayerTeamFromClass (playerid, classid)
if (classid == 0)
gTeam [playerid] = TEAM_GROVE;
>
else
gTeam [playerid] = TEAM_BALLA;
>
>Вставьте этот код ВНЕ каких-либо функций в вашем коде (поскольку это - новая функция) и поместите нижеуказанный код сразу после открытых изогнутых фигурных скобок в вашем callback`е OnPlayerRequestClass (обратите внимание на способ, при которым переменные не глобальны, так что мы должны передать их, чтобы все функционировало):

Код:
SetPlayerTeamFromClass (playerid, classid);Это сохранит команду игрока в массив через нашу новую функцию. На данные в массиве ссылаются числа, таким образом массив[0] - первый элемент данных, массив[1] - второй и так далее. Поскольку мы используем gTeam [playerid], номер места для данных в массиве будет определяться параметром playerid, таким образом для игрока с id 5 данные будут сохранены в массиве под номером 5 (помните, это - 6-ая часть данных). Теперь скопируйте эту функцию:

Код:
public SetPlayerToTeamColor (playerid)
if (gTeam [playerid] == TEAM_GROVE)
SetPlayerColor (playerid, TEAM_GROVE_COLOR);
>
esle if (gTeam [playerid] == TEAM_BALLA)
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
>
>И добавьте следующую строку к OnPlayerSpawn:

Код:
SetPlayerToTeamColor (playerid);Теперь мы имеем наши команды, но что мы фактически сделали?

Код:
if (classid == 0)
gTeam [playerid] = TEAM_GROVE;
>В нашей первой функции мы проверяем, какой класс выбрал игрок (помните, как мы сказали, что первый класс, заданный в вашем скрипте, будет иметь номер 0?) "==" означает "является равным", "=" же используется для того, чтобы задавать значения переменным (как это делается во второй строке). В изогнутые фигурные скобки сразу после условия заключают следствие функции. В нашем случае оно выполнится только если игрок выберет класс с номером 0 (это скин cj), если же он выберет иной класс, в игру вступят команды else (они выполняется всякий раз, когда условие "if" ложное (то есть выбранный игроком класс имеет номер, отличный от 0)). Так как мы имеем только два класса, класс, чей номер отличен от 0, должен означать, что мы - Balla:

Код:
else
gTeam [playerid] = TEAM_BALLA;
>Мы не нуждаемся в возвращении здесь, поскольку нет никаких данных для возврата.
Вторая половина кода устанавливает цвет игроков, когда они появляются. Благодаря этому Вы сразу можете определить, в какой команде находится тот или иной игрок. Поскольку мы сохранили команду игрока в глобальном массиве, мы можем обращаться к данным даже при том, что они были получены в отдельной функции.

Код:
if (gTeam [playerid] == TEAM_GROVE)
SetPlayerColor (playerid, TEAM_GROVE_COLOR);
>Мы надеемся, что Вы поняли, как работает эта функция. Если игрок, который только что появился (как ссылается playerid), находится в TEAM_GROVE, мы задаем ему цвет TEAM_GROVE.

Код:
else if (gTeam [playerid] == TEAM_BALLA)
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
>То, что мы сделали выше, могло быть сделано проще, с помощью этого кода:

Код:
else
SetPlayerColor (playerid, TEAM_BALLA_COLOR);
>Но этот способ устанавливает TEAM_BALLA цвет TEAM_BALLA_COLOR только если первая часть - ложь (т.к. используется else) И если игрок находится в TEAM_BALLA, вам придется вводить больше опций, добавляя больше блоков "else if ()" до конца, так как только одно условие выполнится, если все блоки до него окажутся ложными.

Тема создана для новичков, всех остальных лесом! Ненужно отписываться Каждому. типо, что это все знают. это всё очень легко. Вы то сами как начинали?-_-

Создал эту тему т.к. сам когда начинал, долго искал инфу как делать команды))
Если такая была. извеняюсь. в поиске не нашёл

И так начнём наше обучение.

Все команды пишутся в автовызываемую функцию OnPlayerCommandText(playerid, cmdtext[])
Давайте напишем нашу первую команду:

А мы переходим к более сложным командам.
Я взял для пример админ-команду /sethp(дать игроку хп)

Pawn - простой язык программирования с открытым исходным кодом. Сегодня мы начинаем серию гайдов по программированию на языке Pawn. Я считаю, что в данный момент появилось очень много новичков мало чего понимающих в программировании и постоянно задающие глупые вопросы. Именно для таких людей, я и решил написать гайды .


Не будем рассказывать о "вступлении" в программировании, о работе процессора, процесса компиляции и интерпретации ( or трансляции ) программы, а сразу попытаемся практично подойти к понятию программировании в Pawn
P.S
Если вы желаете больше влиться в мир программ, советую изучить следующие темы:


Ну что же, давайте разбирать простейший плагин написанный на Pawn для CS 1.6 ( я решил взять броню, ибо считаю здесь есть всё для простого описания ) В любой программе есть 3 блока :

1. Блок подключения заголовочных файлов - в ней подключаются все библиотеки ( библиотека - набор готовых функций движка CS ), для разработки плагина

2. Блок описания функции int main() - так как в Pawn, описание данной функции отсутствует, будем считать этой функцией public plugin_int(). Эта функции является функцией с точкой входа. Когда вы запускаете свой сервер, именно данная функция вызовется первой.

3. Блок описания функций, стоков и событий - блок, в котором вы описываете собственные функции и функции событий которые вы описали в public plugin_init()

  • тип данных
  • значение
  • адрес
  • имя
  • for(идентификация счетчика; условие; инкремент ( прибавление значение счетчика ))
  • while(условие)
  • do< реализация кода >while(условие)
  1. Цикл For
    for(new i=0; i
  2. Цикл while(i
  3. Цикл do< Тело Цикла >while(условие)
    Этот цикл, отличается от других тем, что сначала мы выполняем операции в теле цикла, а только потом проверяем условия, и если оно верно, то снова выполняем операции до момента пока условие не сработает.
  • register_event - регистрирует некоторые из стандартных событий Half-Life. Полный список тут - События Half-Life
  • register_logevent - регистрирует события которые обычно пишутся в логах. Нам нужны чаще всего для начала и конца раунда
  • RegisterHam - не побоюсь для новичков сказать, что это нужно для того, чтобы отловить какое то событие. Но функционал намного выше. Нам чаще всего нужно для событий получение урона, смерти, спавна и других. Удобность - наличие id игрока
  • register_touch - если углубитесь в тему Pawn'а, то эта функция поможет вам отловить событие касание объектов друг об друга
  • Константа EngFunc_PrecacheModel - для кэширования модели или спрайта. Пример: engfunc(EngFunc_PrecacheModel, Model)
  • Константа EngFunc_PrecacheSound - для кэширования звука. Пример engfunc(EngFunc_PrecacheSound, Sound)
  • precache_model
  • precache_sound

&Я не понимаю как работает код&

Для начала, посмотрите на название переменных и событиях описанных в public plugin_init()
Поймите структуру программы, какие функции вызываются первыми, какие используются чаще, какие важные. По смыслу вы сможете понять, в каком месте кода вы должны искать.
Например: Вопрос: Мне нужно в определенном плагине, изменить радиус взрыва ракеты.
Для начала, мне нужно найти функцию, которая отвечает зазапуск самой ракеты. Потом найти, функцию которая отвечает за взрыв ракеты. После чего найти структуру message_begin, ведь скорее всего именно в ней указывается радиус взрыва

&С чего начать писать плагин&

Продумайте в голове все свои мысли. Изобразите структуру вашего плагина на листочке или в Paint ( если вы собрались браться за что то большое ). Потом обдумайте, какие библиотеки ваш лучше использовать. Если вы намереваетесь писать плагин связанный как либо внутри-игровыми объектами: задумайтесь что будет лучше, использовать модуль engine или fakemeta (изучите их для начала). Подумайте, как будут использоваться переменные, какие функции вы распишите, какие события затронете.

То есть, set_user_health(id, Health) -> мы отправляем в функции число которое постоянно хранится в id
А users[id] -> мы обращаемся к массиву users по номеру который записан в id
Ни в коем случае не путайте!

Ну что же, давайте рассмотрим возможные варианты их появления

Нашел хороший пример:
set_pev(iPlayer, pev_velocity, Float:)
В данной функции при её вызове, вы сами должны указать тип Float, чтобы не столкнуться с проблемой 213 предупреждения.

Читайте также: