sourcemod吧 关注:444贴子:2,315

sourcemod教程 个人理解的东西分享下

只看楼主收藏回复

我只写过求生之路2的插件。而最近也已经不打算写了,然后看了下论坛,决定写点什么东西。
我最开始对写插件一窍不通,不过呢自学了一年,最后基本上简单的插件可以写了。
现在呢!觉得sourcemod的插件其实很简单。所以总结下,然后举例说明。
等待求生之路3.


IP属地:四川1楼2015-08-14 19:12回复
    默认插件平台addons\sourcemod\scripting\include中包含所有inc头文件。
    其中一半前期的时候不需要认识。
    当然平台文件中addons\sourcemod\scripting中有些代码是可以学习的。
    其实人人都说写程序没有捷径,这句话是真理。我现在插件有5个G吧。都是源代码。
    其实玩得多,看得多,然后想想,就会懂得更多。


    IP属地:四川3楼2015-08-14 19:25
    回复
      首先是强制分号使用。不许太在意,当然如果喜欢追根问底的可以自己查一下。
      #pragma semicolon 1
      引入头文件,这里如果学过编程语言的都应该知道,这些文件中包含了你要使用函数的原型。
      #include <sourcemod>
      #include <sdktools>
      #include <geoip>
      define 插件作者自己定义的值。固定的。
      1 2 3 对应不同的团队。 求生之路里面 1为空闲 2为生还者 3为感染者。cs和tf好像有所改变。
      #define L4D_TEAM_INFECTED 3 //该定义方式语法 #define 任意 <index> 其中<index> 为getclientteam函数所返回的值。当接触到该函数的时候也就懂了
      #define L4D_TEAM_SURVIVOR 2
      #define L4D_TEAM_SPECTATOR 1
      标题部分 其实可有可无。
      只是呢,当你在游戏控制台输入sm plugins list的时候会显示 name 和 author 的信息
      public Plugin:myinfo =
      {
      name = "上面代码输入后 中文在游戏无法显示",
      author = "名字也是",
      description = "Left 4 Dead 1 & 2",
      version = "1.0",
      url = "http://"
      }


      IP属地:四川4楼2015-08-14 19:36
      回复
        下面,摘用rpg插件来分享下经验 整理下发出来


        IP属地:四川6楼2015-08-14 20:11
        回复
          补充下上一楼说声明的参数为全局静态参数。。全局可见,并且一旦插件执行,就永久生存直到游戏退出window。至于还是不懂全局和静态的可以补习下c语音基础


          IP属地:四川8楼2015-08-14 20:47
          回复
            首先 #define 应该 是编译预处理 (css插件我不懂)
            在编译时 将下面定义好的 全部替换成后面的值 这个应该说明白 是编译是做的事
            也就是说 在下面参数直接写成 定义的值 和define 等效的
            随便说一下 我是新来的
            要学这个
            求罩


            IP属地:广东来自Android客户端13楼2015-08-21 09:41
            收起回复
              好评


              IP属地:广东来自iPhone客户端14楼2015-08-23 01:27
              收起回复
                楼主你好, 可以看看我在吧里发的那个帖子吗?
                我实在是不知道要怎么写了. 谢谢.


                IP属地:广西15楼2015-08-30 02:05
                收起回复
                  非常好哇!
                  教程教材太难找了!
                  多来点儿吧!。。。。。。。。。。。。。。。


                  来自手机贴吧16楼2015-09-19 08:57
                  回复
                    好评and支持
                    顺便一提在css本次更新后,GetEntityCount()函数作废,取得的值居然是负值,我还以为v社突破了css的实体数量限制。然而并不是


                    IP属地:广东来自Android客户端17楼2015-09-30 15:56
                    回复
                      AutoConfigs 部分
                      https://sm.alliedmods.net/api/
                      或者用notepad++ 和 sourcemod语法高亮插件(高亮插件部分高级api不支持,可以自己添加)
                      AutoConfigs 就一个函数,用于产生config文件。
                      AutoExecConfig
                      语法原型:
                      native AutoExecConfig(bool:autoCreate=true, const String:name[]="", const String:folder[]="sourcemod");
                      用法:
                      autoCreateIf true, 如果文件不存在将会自己添加。
                      name文件的名字
                      foldercfg/文件夹下 默认是 "sourcemod."文件中/一般不用填写使用默认值。
                      注意:
                      Specifies that the given config file should be executed after plugin load.
                      OnConfigsExecuted() will not be called until the config file has executed, but it will be called if the execution fails.
                      因为英语不好所以保留注意的原文。
                      意思是在插件加载后必须先执行config file(cfg文件)也就是先运行配置文件。
                      因为OnConfigsExecuted()函数会等待cfg文件被执行。但是如果cfg文件运行失败OnConfigsExecuted也会被调用。
                      这个函数一般使用在OnPluginStart()
                      {
                      AutoExecConfig(true,"我是一个配置文件")
                      }
                      值得注意的是AutoExecConfig函数制作的的配置文件是什么
                      CreateConVar("ConvarName","2","我希望插件默认使用该值",FCVAR_DONTRECORD,true,0,true,10);
                      Syntax:
                      native Handle:CreateConVar(const String:name[], const String:defaultValue[], const String:description[]="", flags=0, bool:hasMin=false, Float:min=0.0, bool:hasMax=false, Float:max=0.0);
                      这个函数一般使用在OnPluginStart()
                      {
                      CreateConVar("ConvarName","2","我希望插件默认使用该值",FCVAR_DONTRECORD,true,0,true,10);
                      AutoExecConfig(true,"我是一个配置文件");
                      }
                      这样一个配置文件就完成了。
                      CreateConVar中FCVAR_DONTRECORD这个flags文件在该api的文件console中有枚举。
                      而FCVAR_DONTRECORD表示不再cfg文件中写出该ConVar的配置文件部分。
                      当然至于配置文件什么样,这里就不多说了,玩过插件应该都知道。
                      顺便再提下HookConVarChange
                      Syntax:
                      native HookConVarChange(Handle:convar, ConVarChanged:callback);
                      该函数实际用处不大,因为是一个很老的api
                      当时CreateConVar还没有bool:hasMin=false, Float:min=0.0, bool:hasMax=false, Float:max=0.0这一个限定部分。
                      Syntax:
                      native Handle:CreateConVar(const String:name[], const String:defaultValue[], const String:description[]="", flags=0);
                      当然现在CreateConVar已经完备了,所以可以忽略HookConVarChange,除非你需要一些特别的功能,但是实际使用确实意义不大。


                      IP属地:四川18楼2015-10-17 22:07
                      收起回复
                        楼主多来一些教程嘛


                        IP属地:陕西28楼2016-01-09 14:27
                        回复
                          收藏了,首先我得学到函数


                          IP属地:广西29楼2016-02-09 05:41
                          回复
                            挖个坟,hook时间回合开始,每次回合开始自动控制台输入buymenu
                            HookEvent("round_start", Event_RoundStart);
                            然后下面怎么写呢?


                            IP属地:江苏30楼2016-03-20 22:48
                            收起回复
                              我一字不漏的看了3小时。真的很想学。希望可以叫声师傅。


                              IP属地:广东31楼2016-04-14 19:58
                              收起回复