Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

Изучение/обучение языку pawn

Дек
2
1
Пользователь

Что такое Pawn и зачем это нужно

Pawn — это простой язык для встраивания в игры/программы.

  • Где используется: В основном в модах для SA-MP (GTA San Andreas Multiplayer)
  • Для чего: Чтобы делать свои сервера, скрипты, миссии
  • Простота: Легче чем C++, но строже чем Python

Что будет в программе:

  1. Теория по частям — от переменных до создания команд
  2. Практика — пишешь код, проверяешь прямо в программе
  3. Примеры из реальных скриптов — как в настоящих модах
  4. Шпаргалки — чтобы не забыть синтаксис

1. Раздел "Основы"

1.1. Что такое переменные
- Цифры: new score = 100;
- Текст: new nick[24] = "John";
- Дробные: Float:health = 100.0;

1.2. Вывод информации
- print("Привет мир!");
- printf("У %s %d HP", name, health);

1.3. Условия (if/else)
- if(money > 1000) { богатый; }
- if(admin == 1) { дать права; }

1.4. Циклы
- for(new i=0; i<10; i++) { }

2. Раздел "Команды для игроков"

2.1. Базовый шаблон команды
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/help", true) == 0)
{
SendClientMessage(playerid, цвет, "Помощь!");
return 1;
}
return 0;
}

2.2. Примеры команд:
- /me [действие]
- /givecash [ид] [сумма]
- /tp [x] [y] [z]

3. Раздел "Функции SA-MP"

3.1. Работа с игроком
- GivePlayerMoney(playerid, money)
- SetPlayerPos(playerid, x, y, z)
- GetPlayerName(playerid, name, sizeof(name))

3.2. Сообщения
- SendClientMessage(playerid, цвет, текст)
- GameTextForAll(текст, время, стиль)

4. Раздел "Базы данных"

4.1. Сохранение статистики
- Сохранить: деньги, уровень, опыт
- Загрузить при входе
- Обновить при выходе

4.2. Пример сохранения:
d_user_save[playerid] = 1; // флаг "нужно сохранить"

Как будем проверять код:

Простой валидатор (проверяльщик кода):

def check_pawn_task(user_code, task_number):
"""Проверяем код ученика"""

# Задание 1: создать переменную
if task_number == 1:
if "new level = 1" in user_code or "new level=1" in user_code:
return "✅ Верно! Переменная создана."
elif "level = 1" in user_code:
return "⚠️ Почти! Добавь 'new' перед level"
else:
return "❌ Не найдено создание переменной"

# Задание 2: простая команда
elif task_number == 2:
if "/help" in user_code and "SendClientMessage" in user_code:
return "✅ Отлично! Команда работает."
else:
return "❌ Проверь: команда /help и SendClientMessage"

Реальные примеры из скриптов:

Пример 1: Команда /me (ролеплей)

if(strcmp(cmd, "/me", true) == 0)
{
new action[128];
if(!sscanf(params, "s[128]", action))
{
new str[144], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(str, sizeof(str), "* %s %s", name, action);
SendClientMessageToAll(0xC2A2DAAA, str);
return 1;
}
return SendClientMessage(playerid, 0xFF0000AA, "Использование: /me [действие]");
}

Что вы сможете сделать после урока:


  • Поймёт структуру Pawn скрипта
  • Создаст свои переменные
  • Напишет первую команду /help
  • Сделает систему денег /givemoney
  • Добавит телепорт /tp
  • Создаст ролеплей команды /me, /do
  • Привяжет данные к базе
  • Сделает авторизацию (/login, /register)
  • Сохранит прогресс игрока
  • Соберёт всё в один мод
  • Протестирует на локальном сервере
  • Исправит баги и ошибки

Стартовый код программы (начало):

import tkinter as tk
from tkinter import ttk, scrolledtext
import os

class PawnLearner:
def __init__(self):
self.window = tk.Tk()
self.window.title("PawnLearner - учим скрипты для SA-MP")
self.window.geometry("900x600")

# Текущий урок
self.current_lesson = 1
self.total_lessons = 10

# Создаем интерфейс
self.create_menu()
self.create_main_area()
self.create_sidebar()

def create_menu(self):
"""Верхнее меню"""
menubar = tk.Menu(self.window)

# Меню Файл
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="Открыть пример", command=self.open_example)
file_menu.add_command(label="Сохранить код", command=self.save_code)
file_menu.add_separator()
file_menu.add_command(label="Выход", command=self.window.quit)
menubar.add_cascade(label="Файл", menu=file_menu)

# Меню Уроки
lessons_menu = tk.Menu(menubar, tearoff=0)
lessons_menu.add_command(label="1. Переменные", command=lambda: self.load_lesson(1))
lessons_menu.add_command(label="2. Команды", command=lambda: self.load_lesson(2))
lessons_menu.add_command(label="3. Функции SA-MP", command=lambda: self.load_lesson(3))
menubar.add_cascade(label="Уроки", menu=lessons_menu)

self.window.config(menu=menubar)

def create_main_area(self):
"""Основная область - теория и редактор"""
# Левая панель - теория
theory_frame = ttk.LabelFrame(self.window, text="Теория", padding=10)
theory_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)

self.theory_text = scrolledtext.ScrolledText(theory_frame, wrap=tk.WORD, width=40)
self.theory_text.pack(fill=tk.BOTH, expand=True)

# Загружаем первый урок
self.load_lesson(1)

# Правая панель - практика
practice_frame = ttk.LabelFrame(self.window, text="Практика", padding=10)
practice_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)

# Задание
ttk.Label(practice_frame, text="Задание:").pack(anchor=tk.W)
self.task_label = ttk.Label(practice_frame, text="Создай переменную: new money = 1000;")
self.task_label.pack(anchor=tk.W, pady=(0, 10))

# Редактор кода
ttk.Label(practice_frame, text="Твой код:").pack(anchor=tk.W)
self.code_editor = scrolledtext.ScrolledText(practice_frame, height=15, wrap=tk.WORD)
self.code_editor.pack(fill=tk.BOTH, expand=True, pady=(0, 10))

# Кнопки
btn_frame = ttk.Frame(practice_frame)
btn_frame.pack(fill=tk.X, pady=5)

ttk.Button(btn_frame, text="Проверить", command=self.check_code).pack(side=tk.LEFT, padx=2)
ttk.Button(btn_frame, text="Очистить", command=self.clear_code).pack(side=tk.LEFT, padx=2)
ttk.Button(btn_frame, text="Подсказка", command=self.show_hint).pack(side=tk.LEFT, padx=2)

# Результат
ttk.Label(practice_frame, text="Результат:").pack(anchor=tk.W)
self.result_text = tk.Text(practice_frame, height=4, bg="#f0f0f0")
self.result_text.pack(fill=tk.X, pady=(0, 10))

def create_sidebar(self):
"""Боковая панель - прогресс"""
sidebar = ttk.Frame(self.window, width=200)
sidebar.pack(side=tk.RIGHT, fill=tk.Y, padx=5, pady=5)

ttk.Label(sidebar, text="Твой прогресс:", font=('Arial', 12, 'bold')).pack(pady=10)

# Прогресс бар
self.progress_bar = ttk.Progressbar(sidebar, length=180, maximum=100)
self.progress_bar.pack(pady=10)

# Быстрые ссылки
ttk.Label(sidebar, text="Шпаргалки:").pack(anchor=tk.W, pady=(20,5))

links = [
"Синтаксис Pawn",
"Функции SA-MP",
"Цвета сообщений",
"Примеры команд"
]

for link in links:
btn = ttk.Button(sidebar, text=link, width=20,
command=lambda l=link: self.open_cheatsheet(l))
btn.pack(pady=2)

def load_lesson(self, lesson_num):
"""Загружаем урок из файла"""
self.current_lesson = lesson_num

# Простой пример урока
lessons = {
1: """📘 Урок 1: Переменные в Pawn

Переменная - это "коробка" для хранения данных.

Цифры:
new money = 1000;
new score = 0;

Текст (массив символов):
new name[24] = "Player";
new msg[128] = "Привет!";

Дробные числа (Float):
Float:health = 100.0;
Float:pos_x = 150.5;

ВАЖНО: Все строки в Pawn - это массивы!
new text[размер] = "текст";""",

2: """📘 Урок 2: Создание команд

Команда в SA-MP - это то, что игрок пишет в чат.

Шаблон команды:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/help", true) == 0)
{
SendClientMessage(playerid, 0x00FF00AA, "Помощь!");
return 1;
}
return 0;
}

Разбор:
- strcmp - сравнение строк
- "/help" - текст команды
- true - игнорировать регистр
- SendClientMessage - отправить сообщение
- return 1 - команда обработана
- return 0 - команда не найдена"""
}

if lesson_num in lessons:
self.theory_text.delete(1.0, tk.END)
self.theory_text.insert(1.0, lessons[lesson_num])

# Меняем задание
if lesson_num == 1:
self.task_label.config(text="Задание: Создай переменную: new level = 1;")
elif lesson_num == 2:
self.task_label.config(text="Задание: Создай команду /hello")

def check_code(self):
"""Проверяем код пользователя"""
code = self.code_editor.get(1.0, tk.END).strip()

if self.current_lesson == 1:
# Проверяем создание переменной
if "new level = 1" in code or "new level=1" in code:
self.show_result("✅ Отлично! Ты создал переменную level!")
self.update_progress(10) # +10% к прогрессу
elif "level = 1" in code:
self.show_result("⚠️ Почти! Добавь 'new' перед level")
else:
self.show_result("❌ Не вижу создание переменной. Пример: new level = 1;")

elif self.current_lesson == 2:
# Проверяем создание команды
if "/hello" in code and "SendClientMessage" in code:
self.show_result("✅ Супер! Команда /hello работает!")
self.update_progress(10)
else:
self.show_result("❌ Нужно: команда /hello и SendClientMessage")

def show_result(self, text):
"""Показываем результат проверки"""
self.result_text.delete(1.0, tk.END)
self.result_text.insert(1.0, text)

def clear_code(self):
"""Очищаем редактор"""
self.code_editor.delete(1.0, tk.END)

def show_hint(self):
"""Показываем подсказку"""
hints = {
1: "💡 Подсказка: Используй 'new' для создания переменной",
2: "💡 Подсказка: Шаблон команды есть в теории выше"
}

if self.current_lesson in hints:
self.show_result(hints[self.current_lesson])

def update_progress(self, points):
"""Обновляем прогресс бар"""
current = self.progress_bar['value']
self.progress_bar['value'] = min(current + points, 100)

def open_example(self):
"""Открываем пример кода"""
# Простые примеры
examples = {
"Команда /me": """
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/me", true) == 0)
{
new action[128];
if(sscanf(params, "s[128]", action))
return SendClientMessage(playerid, 0xFF0000AA, "Используй: /me [действие]");

new str[144], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(str, sizeof(str), "* %s %s", name, action);
SendClientMessageToAll(0xC2A2DAAA, str);
return 1;
}
return 0;
}""",

"Сохранение денег": """
// При выходе игрока
public OnPlayerDisconnect(playerid, reason)
{
new money = GetPlayerMoney(playerid);

// Сохраняем в файл (пример)
new file_name[64], str[16];
GetPlayerName(playerid, file_name, sizeof(file_name));
format(file_name, sizeof(file_name), "players/%s.ini", file_name);

format(str, sizeof(str), "%d", money);
dini_Set(file_name, "Money", str);

return 1;
}"""
}

# Показываем выбор
self.show_result("📁 Примеры:\n1. Команда /me\n2. Сохранение денег\n\nСкопируй и изучи!")

def open_cheatsheet(self, topic):
"""Открываем шпаргалку"""
cheats = {
"Синтаксис Pawn": """
new var = значение; // Число
new text[размер]; // Строка
Float:decimal = 1.5; // Дробное

if(условие) { код; } // Условие
for(new i=0; i<10; i++) // Цикл
printf("Текст %s", var); // Вывод""",

"Цвета сообщений": """
0xFF0000AA - Красный
0x00FF00AA - Зеленый
0x0000FFAA - Синий
0xFFFF00AA - Желтый
0xFFFFFFAA - Белый
0xC2A2DAAA - Ролеплей"""
}

if topic in cheats:
self.show_result(f"📄 {topic}:\n{cheats[topic]}")

def save_code(self):
"""Сохраняем код в файл"""
code = self.code_editor.get(1.0, tk.END)
with open("my_script.pwn", "w", encoding="utf-8") as f:
f.write(code)
self.show_result("💾 Код сохранен в my_script.pwn")

def run(self):
"""Запуск программы"""
self.window.mainloop()

# Запускаем программу
if __name__ == "__main__":
app = PawnLearner()
app.run()
 
Дек
2
1
Пользователь
ГООВОРЮ СРАЗУ ЕСЛИ ВАМ НУЖНО ВЗЯТЬ КОД НАПИШИТЕ СЮДА ОТПРАВЛЮ КОД БЕЗ ЛИШНИХ НАДПИСЕЙ
 
Сверху