Видеоуроки по Sourcepawn

Тема в разделе "Программирование / Скриптинг", создана пользователем neatek3, 5 июл 2015.

  1. neatek3

    neatek3

    Сообщения:
    124
    Симпатии:
    127
    Disclaimer
    Данное видео предназначено для лиц не имеющих опыта в программировании.
    Оно служит для своего рода ознакомлением.


    http://www.youtube.com/watch?v=I7hRhnytNY8
    Выпуск №1

    Описание: Первый выпуск урока по Sourcepawn скриптинг для Sourcemod,
    на новом синтаксисе. В данном видеоуроке рассмотрена установка среды скриптинга,
    немного затрагивая типы переменных, классы, KeyValues формат данных.

    Следующий выпуск:
    Обзор основных событий, смерть игрока, появление игрока, заход на сервер, выход с сервера.
    Функция написания в чат.
    1. Обзор событий.
    2. Написание Helloworld.

    После второго выпуска, планирую уйти в условия, и массивы.

    Решил делать выпуски с самого низа, от типов данных, и до сложных задач.
     
    Flekon, komashchenko, Danyas и 4 другим нравится это.
  2. Napas

    Napas

    Сообщения:
    471
    Симпатии:
    38
    Буду смотреть, может скриптингом так и займусь )
     
    neatek3 нравится это.
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.002
    Симпатии:
    2.993
    Потерял "самый главный" тип void. Новички будут спрашивать.
    char это символ, а строка это уже массив символов.
    У меню теперь свой класс Menu, а не хандл.
    Не забывай про Function еще.
    TopMenu
    ArrayStack
    StringMap (бывший trie)
    Event
    Regex и прочее.

    PHP:
    KeyValues kv CreateKeyValues
    Юзай конструктор:
    PHP:
    KeyValues kv = new KeyValues("name")
    И деструктором или оператором delete.

    OnPluginStart -> void, не теряй типы.
     
    neatek3 нравится это.
  4. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Очень быстро говоришь, бывает местами, очень тихо и не понятно, как будто волнуешься.
     
  5. neatek3

    neatek3

    Сообщения:
    124
    Симпатии:
    127
    Ну я ж написал основные)

    Да забыл я про Menu, void. косяк
    Потом всё равно для каждого класса нужно по выпуску делать.

    Как-то мне сказал человек с большим опытом в программировании "пиши так как знаешь - главное чтобы работало, и если нужно будет делать оптимизацию - делай, но не изначально".

    Я пытался выделять основные слова интонацией и отрезать их промежутками.
    Видимо не очень вышло. И микрофон хреновый, я обработку делал... на удаление шума.

    Я пытаюсь... :dntknw:
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.002
    Симпатии:
    2.993
    А это и есть один из основых. Посмотри какой тип имеют большинство форвардов и событий.
     
  7. ThreshHNS

    ThreshHNS

    Сообщения:
    229
    Симпатии:
    26
    neatek3, спасибо,давно ждал видео такого рода!
     
  8. DarklSide

    DarklSide

    Сообщения:
    685
    Симпатии:
    173
    Первым делом, что нужно добавить после всех инклудов:
    PHP:
    #pragma newdecls required
    Если утерян - список поддержки нового ситаксиса, Find in SM source code:
    PHP:
    // Transitional
     
    neatek3 нравится это.
  9. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.570
    Симпатии:
    1.153
    Давай ещё видео))
     
    neatek3 нравится это.
  10. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    К автору видео. Эти замечания - критика и желание помочь разобраться в мелочах, раз уж есть желание делать обучающие видео. Если обучать, то сразу правильно, это нельзя сравнить с процессом написания плагина! Можно где-то опускать мелочи, но нельзя давать неправильную информацию.

    Полностью отсутствует желание разбираться в важных деталях. Этот момент вызвал у меня глубочайшее сожаление, я уж надеялся, что наконец-то человек разобрался и сделал хоть вводное видео без грубейших ошибок, но нет...
    [​IMG]
    Начинается ляп с самой фразы "классы для работы с переменными". А какой класс тогда не работает с переменными?

    Каким образом здесь Handle оказалось в середине списка и рассказывается о нем наравне со всеми? Handle есть родительский класс всех этих классов, и это указатель на объект. Он может использоваться как все эти перечисленные классы, а они не могут использоваться в качестве него. Более того, это необходимо знать.

    Второй ляп на данном скриншоте - опять имена переменных. Почему все переменные MyClass, а KeyValues kv? Потом возникают лишние вопросы, да и люди привыкают называть переменные так, как им угодно, без всякой логики.

    В третьих, из-за незнания так и вышло, что пропущено как минимум 11 классов, основанных на Handle. В вики сурсмода они есть:
    1 BitBuffers
    2 ConVars
    3 DataPacks
    4 Directories
    5 Database Drivers
    6 Database Queries
    7 Databases
    8 Events
    9 Files
    10 Forwards
    11 KeyValues
    12 Plugins
    13 Plugin Iterators
    14 Protobuf
    15 SMC Parsers
    16 Timers

    [​IMG]
    Опять ляп - везде до этого комментарии были написаны без своего знака, тут без объяснений они откуда-то появились, еще и были выделены нотепадом. Между тем в начале скрина стоит текст без комментариев, что вызовет у людей соответствующие сомнения.
    Вторая ошибка - а почему именно Format? Не FormatEx(), или более подходящий для такой цели strcopy()?

    Всё, что связано с КВ, просто ни о чем. Вообще. Лучше ничего не говорить, т.к. для того, чтобы рассказать про него, нужно как минимум минут 10 - структура кв, что такое секция, что такое ключ, попутно рассказать про SMC Parser, который тоже связан с КВ. Сейчас же это вызовет у человека лишь непонимание и страх перед работой с кв, не более.
    [​IMG]
    Во-первых, от старого синтаксиса CloseHandle(), когда как можно использовать ключевое слово delete.
    Во-вторых, зачем GoBack()?

    Так же говорится про шаблон плагина. Шаблон это то, что мы можем применить к решению большинства задач. Код, представленный в уроке - далеко не шаблон. Примером шаблона может являться такой код:
    Код:
    #pragma semicolon 1
    #include <sourcemod>
    #include <sdktools>
    #include <sdkhooks>
    
    #define PLUGIN_VERSION "1.0.0.0"
    public Plugin:myinfo =
    {
    	name 		= "",
    	author 		= "AlexTheRegent",
    	description 	= "",
    	version 	= PLUGIN_VERSION,
    	url 		= ""
    }
    
    public OnPluginStart() 
    {
    	
    }
    
    public OnMapStart() 
    {
    	
    }
    
    public OnConfigsExecuted() 
    {
    	
    }
    
    При написании плагина мне остается лишь вставить название плагина и всё. А в видео можно сказать "скомпилировать наш скрипт".

    "... это предупреждения - ... плагин будет работать, но не совсем корректно".
    Код:
    float myFloat = 5;
    Будет warning 213: tag mismatch. В чем будет некорректность работы плагина?
    Предупреждение - это лишь сообщение компилятора о том, что он не понимает, зачем это нужно (например, предупреждение 204 "переменная объявлена, но не используется" warning 204: symbol is assigned a value that is never used: "myFloat"), либо предупреждает, что данный код содержит потенциальную ошибку (то же 213 предупреждение - "несовпадение типов").

    Это лишь те ошибки, которые сразу бросаются в глаза. Так что моё личное мнение - данное видео необходимо переделать, так как содержит в себе ошибки, в том числе и одну грубую - Handle, так как его нужно отнести к основным типам переменных, наравне с int, float, char.
     
    NiGaByte, Konstantin, Danyas и 3 другим нравится это.
  11. максимка27

    максимка27

    Сообщения:
    517
    Симпатии:
    170
    Reiko1231, мне кажется, народ ждёт именно от тебя уроков по скриптингу, было бы приятно именно твои мануалы почитать и послушать))) чётко и ясно всё объясняешь. Так что просим)))
     
  12. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.002
    Симпатии:
    2.993
    максимка27, +1
     
  13. DarklSide

    DarklSide

    Сообщения:
    685
    Симпатии:
    173
    neatek3, Затрагивая типы данных - неплохо разъяснить их фундаментальные понятия: размерность и диапазон значений.
     
  14. neatek3

    neatek3

    Сообщения:
    124
    Симпатии:
    127
    И это огрооооооооооооомнооооооопооооооооост...

    Будет много видосов) :)
    Постараюсь через день выпускать.

    прост.

    прост.

    Ясна собачая сорделька! Читай выше мой пост.
    >> Потом всё равно для каждого класса нужно по выпуску делать.
    В курсе. Поэтому и написал "основных", которые я юзаю.

    Какая-то наркомания... я что под кайфом был? :secret: думаю для работы с объектами...

    Когда можешь писать плагины, и знаешь как и что использовать.. теория пфф... ну да подучить надо.

    В том чтобы отучить людей от warning'ов, и их исправляли.
    ненавижу когда там предупреждения...

    да, было бы не плохо... распиши мне их.

    Ой все, обидка. Я ушел, делайте уроки сами)

    Объясни мне для начала что такое handle ибо я вообще не рублю что это такое, я уже несколько лет это использую но нихрена не понимаю что это такое.
    я знаю его особенности, особенности утечки памяти, как корректно закрывать и прочее, но не понимаю что это.
    написано что handle какойто объект, больше чем указатели в c/c++, но ваще ни о чём не говорит.
    https://wiki.alliedmods.net/Handles_(SourceMod_Scripting)

    да и в прочем, я думаю можно уйти от Handle так как сейчас существуют классы
     
  15. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.002
    Симпатии:
    2.993
    neatek3, Как я понимаю Handle - это указатель на нечто (область памяти), где хранится нужный объект.
    Типа есть нечто (как СУБД для БД) например для меню, какой-то менеджер меню. Он хранит в себе имя меню, пункты, обратные вызовы и прочее. Вот хандл и есть ссылка на него. НО это только в моем понимании.
    Если не прав - поправьте.
    Могу помочь с уроками по kv, event, menu, db, нативами и форвардами.
     
  16. neatek3

    neatek3

    Сообщения:
    124
    Симпатии:
    127
    [​IMG]

    На самом деле ты скинул полезную вещь, и я желаю чтобы разработчики Sourcemod насильно включили этот параметр по дефалту, и можно было бы также выключать. Тогда бы у меня проблем с new syntax не было бы. черт, говорить по англ проще чем по русски. долбанный Transitional Syntax...
     

    Вложения:

    • 67.jpg
      67.jpg
      Размер файла:
      77,9 КБ
      Просмотров:
      69
  17. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.002
    Симпатии:
    2.993
    neatek3, просто нужно csgocolors перепилить под новый синтаксис.. он же на инклюды тоже распространяется.
     
  18. neatek3

    neatek3

    Сообщения:
    124
    Симпатии:
    127
    PHP:
    #pragma newdecls optional 
    в начало csgocolors, и не парюсь. csgocolors инклуд не трогает, а плагин - да. и эдрить у мя тут new declrs...

    начиная с:
    PHP:
    public Plugin myinfo =
    Мои частые ошибки:
    PHP:
    //public Function() {}
    void Function() {}

    //public Function(integer) {}
    void Function(int integer) {}

    //public Action CommandCallback(client, args) 
    public Action CommandCallback(int clientint args

    //public OnPluginStart() 
    public void OnPluginStart()

    //public Action TimerCallback(Handle timer, any:client)
    public Action TimerCallback(Handle timerany client)

    //public Action TimerCallback(Handle:timer)
    public Action TimerCallback(Handle timer)

    //public Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
    public Action Event_RoundEnd(Event event, const char[] namebool dontBroadcast)

    //public MenuAction_EditorMenu(Menu menu, MenuAction action, int client, int item)

    жуть! куча мелких исправлений.

    Вывод:
    PHP:
    #pragma newdecls required
    обязателен при создании новых плагинов.

    Что делать с магазином... такого рода исправлений там наверно будет :wacko:

    PHP:
    public MenuAction_Handler(Menu menuMenuAction actionint clientint item)
    Не могу понять как исправить... -_-
    https://sm.alliedmods.net/new-api/menus/MenuHandler

    Ответ:
    PHP:
    public int MenuAction_Handler(Menu menuMenuAction actionint clientint item)
    писец.
     
    Последнее редактирование: 7 июл 2015
  19. DarklSide

    DarklSide

    Сообщения:
    685
    Симпатии:
    173
    PHP:
    #pragma newdecls required
    P.S.: т.к. они еще не парсированы (не обновлены, под Transitional Syntax).