[AMXX]return问题

Home Home
引用 | 编辑 calove00
2010-04-07 11:31
楼主
推文 x0
有时看到有些amxx是这的

public function(id)
{
 return xxxxxxxx(id)
}

xxxxx(id)

那儿其实是怎么才会触发...

我不用上这..

但看别的有用...

想知道表情

献花 x0
引用 | 编辑 Abcdzxc555
2010-04-07 12:24
1楼
  
return XXXXXX(id)?? 有这样的指令吗表情
应该是
return PLUGIN_CONTINUE;等等的吧 表情

献花 x0
引用 | 编辑 lkh1018
2010-04-07 13:22
2楼
  
return XXXXXX(id)?? 有这样的指令吗
有!!

例如
public event_ResetHUD(id) {
  if(is_user_alive(id))
    return function2(id)
  if(is_user_bot(id))
    return function3(id)
  return function4(id)
}

function2(id) {
  ...
  ...
  ...
  return PLUGIN_CONTINUE
}

function3(id) {
  ...
  ...
  ...
  return PLUGIN_HANDLED
}

function4(id) {
  ...
  ...
  ...
  return PLUGIN_HANDLED_MAIN
}

例如ResetHUD这event被触法
而那人是在生的, 就会跑到function2(id),
而function2(id)最后是return plugin_continue,
那function1(id)那里的function2(id)的value就是plugin_continue
那function1(id)最后return的就是plugin_continue

所以这段编码就是,
而那人是在生的, 就return plugin_continue
而那人是死亡又是bot的, 就return plugin_handled
而其余的, 就return plugin_handled_main

献花 x0
引用 | 编辑 chuchung712
2010-04-07 17:28
3楼
  
下面是引用 lkh1018 于 2010-04-07 13:22 发表的 : 到引言文
return XXXXXX(id)?? 有这样的指令吗
有!!
例如
public event_ResetHUD(id) {
  if(is_user_alive(id))
.......

我想问问
return PLUGIN_CONTINUE
return PLUGIN_HANDLED
这两个有啥分别?
return 0 啊, 1啊, -1啊又怎样用?
感谢~

献花 x0
引用 | 编辑 a7811311622
2010-04-07 17:45
4楼
  
下面是引用 chuchung712 于 2010-04-07 17:28 发表的 : 到引言文

我想问问
return PLUGIN_CONTINUE
return PLUGIN_HANDLED
这两个有啥分别?
return 0 啊, 1啊, -1啊又怎样用?
感谢~

比较简单的说法是:
PLUGIN_CONTINUE:可能只跳过程式里面的其中几段
PLUGIN_HANDLED:整段程式直接跳过
这要有例子才比较好讲解…表情

献花 x0
引用 | 编辑 chuchung712
2010-04-07 18:38
5楼
  
下面是引用 a7811311622 于 2010-04-07 17:45 发表的 : 到引言文

比较简单的说法是:
PLUGIN_CONTINUE:可能只跳过程式里面的其中几段
PLUGIN_HANDLED:整段程式直接跳过
这要有例子才比较好讲解…表情

这是AlliedModders的黄金AK插件中的其中一部分 @@
复制程式
public checkWeapon(id) 
{ 
 new plrClip, plrAmmo, plrWeap[32] 
 new plrWeapId 
  
 plrWeapId = get_user_weapon(id, plrClip , plrAmmo) 
  
 if (plrWeapId == CSW_AK47 && g_HasAk[id]) 
 { 
  checkModel(id) 
 } 
 else 
 { 
  return PLUGIN_CONTINUE
 } 
  
 if (plrClip == 0 && get_pcvar_num(cvar_uclip)) 
 { 
  // If the user is out of ammo.. 
  get_weaponname(plrWeapId, plrWeap, 31) 
  // Get the name of their weapon 
  give_item(id, plrWeap) 
  engclient_cmd(id, plrWeap) 
  engclient_cmd(id, plrWeap) 
  engclient_cmd(id, plrWeap) 
 } 
 return PLUGIN_HANDLED
}


献花 x0
引用 | 编辑 a7811311622
2010-04-07 18:58
6楼
  
下面是引用 chuchung712 于 2010-04-07 18:38 发表的 : 到引言文

这是AlliedModders的黄金AK插件中的其中一部分 @@

复制程式
public checkWeapon(id) 
{ 
 new plrClip, plrAmmo, plrWeap[32] 
.......[/quote] 
[code] 
public checkWeapon(id)  
{  
 new plrClip, plrAmmo, plrWeap[32]  
 new plrWeapId  
   
 plrWeapId = get_user_weapon(id, plrClip , plrAmmo)  
   
 if (plrWeapId == CSW_AK47 && g_HasAk[id])  
 {  
  checkModel(id)  
 }  
 else  
 {  
  return PLUGIN_CONTINUE 
  /* 
  这段回传的结果是脱离「public checkWeapon(id)」这段假设,
  如果条件符合,则从这段开始往下的内容就不会判断和执行
  */ 
 }  
   
 if (plrClip == 0 && get_pcvar_num(cvar_uclip))  
 {  
  // If the user is out of ammo..  
  get_weaponname(plrWeapId, plrWeap, 31)  
  // Get the name of their weapon  
  give_item(id, plrWeap)  
  engclient_cmd(id, plrWeap)  
  engclient_cmd(id, plrWeap)  
  engclient_cmd(id, plrWeap)  
 }  
 return PLUGIN_HANDLED // 单纯让上面的「return PLUGIN_CONTINUE」有回传值罢了… 
} 


献花 x0
引用 | 编辑 chuchung712
2010-04-07 20:30
7楼
  
下面是引用 a7811311622 于 2010-04-07 18:58 发表的 : 到引言文

[code]public checkWeapon(id)
{
 new plrClip, plrAmmo, plrWeap[32]
.......

开始明白了...
但如果if 里有continue呢?
还有return 0, -1, 1是什么意思...
谢 

献花 x1
引用 | 编辑 a7811311622
2010-04-07 21:05
8楼
  
下面是引用 chuchung712 于 2010-04-07 20:30 发表的 : 到引言文

开始明白了...
但如果if 里有continue呢?
还有return 0, -1, 1是什么意思...
谢 

后来发现我上面说错了…(最近上课学JAVA后搞乱了…)
continue其实和PLUGIN_CONTINUE是一样的用意,
至于return 0,1 其实就等于PLUGIN_CONTINUE和PLUGIN_HANDLED
这在<amxconst.inc>里面有说明,
不过我倒是没看过return -1 的说…保守猜测成回传空值(null)好了…

献花 x1
引用 | 编辑 chuchung712
2010-04-08 11:09
9楼
  
下面是引用 a7811311622 于 2010-04-07 21:05 发表的 : 到引言文

后来发现我上面说错了…(最近上课学JAVA后搞乱了…)
continue其实和PLUGIN_CONTINUE是一样的用意,
至于return 0,1 其实就等于PLUGIN_CONTINUE和PLUGIN_HANDLED
这在<amxconst.inc>里面有说明,
不过我倒是没看过return -1 的说…保守猜测成回传空值(null)好了…

恩...
发现了
复制程式
#define PLUGIN_CONTINUE  0 /* Results returned by public functions */
#define PLUGIN_HANDLED  1 /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2 /* to use in client_command(), continue all plugins but stop the command */
再问一个问题
if 里面可以有 PLUGIN_HANDLED 的吗?
反之 public 里, if 外面可以有 PLUGIN_CONTINUE 吗?

献花 x0
引用 | 编辑 a7811311622
2010-04-08 11:18
10楼
  
下面是引用 chuchung712 于 2010-04-08 11:09 发表的 : 到引言文

恩...
发现了
复制程式
#define PLUGIN_CONTINUE  0 /* Results returned by public functions */ 
#define PLUGIN_HANDLED  1 /* stop other plugins */ 
#define PLUGIN_HANDLED_MAIN 2 /* to use in client_command(), continue all plugins but stop the command */

再问一个问题
if 里面可以有 PLUGIN_HANDLED 的吗?
反之 public 里, if 外面可以有 PLUGIN_CONTINUE 吗?

「if 里面可以有 PLUGIN_HANDLED 的吗?」:
可以,PLUGIN_CONTINUE和PLUGIN_HANDLED的差异只是影响程度大小。
「public 里, if 外面可以有 PLUGIN_CONTINUE 吗?」:
可以,就如同中途在public里加上continue是一样的,只会执行该段public里continue以上的内容。

献花 x0
引用 | 编辑 chuchung712
2010-04-08 11:35
11楼
  
下面是引用 a7811311622 于 2010-04-08 11:18 发表的 : 到引言文

「if 里面可以有 PLUGIN_HANDLED 的吗?」:
可以,PLUGIN_CONTINUE和PLUGIN_HANDLED的差异只是影响程度大小。
「public 里, if 外面可以有 PLUGIN_CONTINUE 吗?」:
可以,就如同中途在public里加上continue是一样的,只会执行该段public里continue以上的内容。

PLUGIN_CONTINUE 是明白了...
但始终不太明白PLUGIN_HANDLED... = =
抱歉

献花 x0
引用 | 编辑 a7811311622
2010-04-08 11:45
12楼
  
下面是引用 chuchung712 于 2010-04-08 11:35 发表的 : 到引言文

PLUGIN_CONTINUE 是明白了...
但始终不太明白PLUGIN_HANDLED... = =
抱歉

这篇的4楼有说明:http://bbs.mychat.to/reads.php?tid=829127&page=1#p5903760

献花 x0
引用 | 编辑 HsK
2010-04-08 11:49
13楼
  
那 return HAM_SUPERCEDE; 和 return FMRES_SUPERCEDE; 呢-.-

return HAM_ 和 return FMRES_ 又有甚么分别 @@"

献花 x0
引用 | 编辑 chuchung712
2010-04-08 12:15
14楼
  
下面是引用 a7811311622 于 2010-04-08 11:45 发表的 : 到引言文

这篇的4楼有说明:http://bbs.mychat.to/reads.php?tid=829127&page=1#p5903760

下面是引用 a7811311622 于 2010-04-08 11:18 发表的: 到引言文

「if 里面可以有 PLUGIN_HANDLED 的吗?」:
可以,PLUGIN_CONTINUE和PLUGIN_HANDLED的差异只是影响程度大小。
「public 里, if 外面可以有 PLUGIN_CONTINUE 吗?」:
可以,就如同中途在public里加上continue是一样的,只会执行该段public里continue以上的内容。
那么两个是可以交换使用的了?
PLUGIN_HANDLED的程度是较大或较小 = ="
好像怎教也教不明... = ="

献花 x0
引用 | 编辑 a7811311622
2010-04-08 12:20
15楼
  
下面是引用 sk@.@ 于 2010-04-08 11:49 发表的 : 到引言文
那 return HAM_SUPERCEDE; 和 return FMRES_SUPERCEDE; 呢-.-

return HAM_ 和 return FMRES_ 又有甚么分别 @@"

「return HAM_SUPERCEDE; 和 return FMRES_SUPERCEDE;」:
在"RegisterHam"和"register_forward"中才会用到的,效果类似continue。
「return HAM_ 和 return FMRES_ 又有甚么分别」:
"return HAM_"是用在"RegisterHam"里的,而"return FMRES_"是用在"register_forward"里的。
详情请翻阅<ham_const.inc>和<fakemeta_const.inc>的说~表情

献花 x0
引用 | 编辑 a7811311622
2010-04-08 12:26
16楼
  
下面是引用 chuchung712 于 2010-04-08 12:15 发表的 : 到引言文


那么两个是可以交换使用的了?
PLUGIN_HANDLED的程度是较大或较小 = ="
好像怎教也教不明... = ="

下面是引用 storym88349 于 2009-09-22 19:12 发表的 : 到引言文
return的用法有三个:return PLUGIN_CONTINUE/PLUGIN_HANDLED/PLUGIN_HANDLED_MAIN
第一个就是继续使用插件
第二个是说插件命令停止,直到下次呼叫
第三个我不太会用,大概是说停止命令,但不中断呼叫
此外,可以打得简短些,根据我打得次序,可以只打0/1/2来代替

以这段解说来看,PLUGIN_HANDLED的程度明显较大~
使用上…反正效果差不多…如果不太会用…就保守点都用PLUGIN_CONTINUE就好了~

献花 x0
引用 | 编辑 chuchung712
2010-04-08 12:31
17楼
  
下面是引用 a7811311622 于 2010-04-08 12:26 发表的 : 到引言文


以这段解说来看,PLUGIN_HANDLED的程度明显较大~
使用上…反正效果差不多…如果不太会用…就保守点都用PLUGIN_CONTINUE就好了~

都用PLUGIN_CONTINUE就可以了? @@
========================================
话说return a value不是0, 1那些吗 = =
我写 return 0, 1他都说 should return a value = ="

献花 x0
引用 | 编辑 a7811311622
2010-04-08 14:00
18楼
  
下面是引用 chuchung712 于 2010-04-08 12:31 发表的 : 到引言文

都用PLUGIN_CONTINUE就可以了? @@
========================================
话说return a value不是0, 1那些吗 = =
我写 return 0, 1他都说 should return a value = ="

有时候还是打完整会比较妥当…你是用在哪里…?

献花 x0
引用 | 编辑 森之千手
2010-04-08 14:04
19楼
  
请问什么时候会用?
可以不用吗?

献花 x0
引用 | 编辑 a7811311622
2010-04-08 14:08
20楼
  
下面是引用 森之千手 于 2010-04-08 14:04 发表的 : 到引言文
请问什么时候会用?
可以不用吗?

如果你全部都是以「正向」思考的话应该是不会用到…
return大概都是用在「反向」思考吧…(应该…)

献花 x0
引用 | 编辑 chuchung712
2010-04-08 16:40
21楼
  
下面是引用 a7811311622 于 2010-04-08 14:00 发表的 : 到引言文

有时候还是打完整会比较妥当…你是用在哪里…?

public Death
public NewRound
public fw_PlayerPreThink 这3个
======================================
复制程式
stock fm_give_item(index, const item[]) 
{ 
 if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10)) 
  return 0; 
 new ent = fm_create_entity(item); 
 if (!pev_valid(ent)) 
  return 0; 
 new Float:origin[3]; 
 pev(index, pev_origin, origin); 
 set_pev(ent, pev_origin, origin); 
 set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN); 
 dllfunc(DLLFunc_Spawn, ent); 
 new save = pev(ent, pev_solid); 
 dllfunc(DLLFunc_Touch, ent, index); 
 if (pev(ent, pev_solid) != save) 
  return ent; 
 engfunc(EngFunc_RemoveEntity, ent); 
 return -1; 
}

发现有 return -1 了 表情   = =

下面是引用 森之千手 于 2010-04-08 14:04 发表的 :
请问什么时候会用?
可以不用吗?
发现你的武器制作是没有return PLUGIN_XXX 的 = ="
都是return 就算了

下面是引用 a7811311622 于 2010-04-08 14:08 发表的 : 到引言文

如果你全部都是以「正向」思考的话应该是不会用到…
return大概都是用在「反向」思考吧…(应该…)

不写return都有这效果?

献花 x0
引用 | 编辑 a7811311622
2010-04-08 17:19
22楼
  
下面是引用 chuchung712 于 2010-04-08 16:40 发表的 : 到引言文
发现有 return -1 了   = =

复制程式
 
stock fm_give_item(index, const item[])  
{  
 if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))  
  return 0;  // 回传数值0 = 跳脱这个stock 
 new ent = fm_create_entity(item);  
 if (!pev_valid(ent))  
  return 0;  // 同上 
 new Float:origin[3];  
 pev(index, pev_origin, origin);  
 set_pev(ent, pev_origin, origin);  
 set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);  
 dllfunc(DLLFunc_Spawn, ent);  
 new save = pev(ent, pev_solid);  
 dllfunc(DLLFunc_Touch, ent, index);  
 if (pev(ent, pev_solid) != save)  
  return ent;  // 回传ent的数值 
 engfunc(EngFunc_RemoveEntity, ent);  
 return -1;  // 让上面的return有回传值(猜测) 
 /* 
 Java或C语法如果return后面有数值的话,后面的数值型态需相同 
 例如上面return后面全部回传的都是整数 
 */ 
} 

下面是引用 chuchung712 于 2010-04-08 16:40 发表的 : 到引言文
不写return都有这效果?

也是可以不用到任何return就能完成插件,就看你排版会不会混乱而已…表情

献花 x0
引用 | 编辑 chuchung712
2010-04-08 17:46
23楼
  
下面是引用 a7811311622 于 2010-04-08 17:19 发表的 : 到引言文

[code]
stock fm_give_item(index, const item[]) 

 if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10)) 
.......

嗯...
那return就是没用的了 @@

献花 x0
引用 | 编辑 a7811311622
2010-04-08 18:04
24楼
  
下面是引用 chuchung712 于 2010-04-08 17:46 发表的 : 到引言文

嗯...
那return就是没用的了 @@

不至于说成「没用」…顶多算是「可以不用」…表情

献花 x0
引用 | 编辑 chuchung712
2010-04-08 21:22
25楼
  
下面是引用 a7811311622 于 2010-04-08 18:04 发表的 : 到引言文

不至于说成「没用」…顶多算是「可以不用」…表情

差不多 表情

献花 x0
引用 | 编辑 calove00
2010-04-09 14:04
26楼
  
你们这班人还未弄清楚什么是

return PLUGIN_CONTINUE
return PLUGIN_HANDLED

a7811311622 你间直说错
PLUGIN_CONTINUE:可能只跳过程式里面的其中几段
PLUGIN_HANDLED:整段程式直接跳过

return PLUGIN_CONTINUE 是指你那个function 可以继续进行

return PLUGIN_HANDLED 是指这个function 停止或关闭


我所问题系

return xxxx(id)



return client_cmd(id, "kill")

刚才问了我的朋友

这只是一个简化的用语

即是

复制程式
public function(id)
{
   client_cmd(id, "kill") 
   return
}

可能只跳过程式里面的其中几段表情

表情

献花 x0
引用 | 编辑 a7811311622
2010-04-09 15:01
27楼
  
下面是引用 calove00 于 2010-04-09 14:04 发表的 : 到引言文
你们这班人还未弄清楚什么是

return PLUGIN_CONTINUE
return PLUGIN_HANDLED

a7811311622 你间直说错
PLUGIN_CONTINUE:可能只跳过程式里面的其中几段
PLUGIN_HANDLED:整段程式直接跳过

return PLUGIN_CONTINUE 是指你那个function 可以继续进行

return PLUGIN_HANDLED 是指这个function 停止或关闭


我所问题系

return xxxx(id)



return client_cmd(id, "kill")

刚才问了我的朋友

这只是一个简化的用语

即是

复制程式
public function(id) 
{ 
   client_cmd(id, "kill") 
   return 
}


可能只跳过程式里面的其中几段表情

表情

我比较想知道你是问谁…表情
我说「PLUGIN_CONTINUE」是可能只跳过程式里面的其中几段…你有讨论其他可能的假设吗?

「return PLUGIN_CONTINUE 是指你那个function 可以继续进行 」:
你这句话错的更离谱…在「public function(id) 」用了「return PLUGIN_CONTINUE」后
return以下的内容可是完全跳过…怎么继续进行?

还有…
public function(id)
{
   client_cmd(id, "kill")
   return
}
这段后面有没有加return根本就没差…
而这段要呼叫就要用「function(id)」或「return function(id)」了…
居然还说简化后是「return client_cmd(id, "kill")」…?

结论:
既然我回答就会被批评成这样…那你直接去问你那超强的朋友就好啦…何必来发问…?
而且问的人还公然说回答的人错…提问等于不知,而不知的人居然知道别人答错?你哪里不知?
好心回答还被说「你们这班人」是吗?那我以后都装不知道好了…
反正有你这高手在…我继续研究我的插件好了…别人要怎么回答随便…反正你都说我错的很离谱了…

献花 x0
引用 | 编辑 Rubbish-Nec
2010-04-09 15:10
28楼
  
下面是引用 calove00 于 2010-04-09 14:04 发表的 : 到引言文
你们这班人还未弄清楚什么是
return PLUGIN_CONTINUE
return PLUGIN_HANDLED
a7811311622 你间直说错
PLUGIN_CONTINUE:可能只跳过程式里面的其中几段
.......

幸好灵气SMA没放在ZP的scipting里,逃过一劫表情

抽一小段来看看

复制程式
Reset_Target_Auras_Effect(id)
{
    for (new i = 1; i <= 32; i++)
    {
        if (i == id) 
        {
            continue;
        }
        
        useMight[i] &= ~(1<<id)
        useBlessed[i] &= ~(1<<id)
        useFanaticism[i] &= ~(1<<id)
        useConviction[i] &= ~(1<<id)
        useVigor[i] &= ~(1<<id)
    }
}

这段东西只有continue;看不懂

直接翻译的结果就是:
如果『i』等于『id』就继续?

还有『 ; 』的用意是?

献花 x1