cityhonghu 发表于 2009-9-10 04:51:42

求助,write_short函数使用方法(已解决)

本帖最后由 cityhonghu 于 2009-10-4 12:03 编辑

这是死亡变红插件的代码,想知道其中的3行write_short部分是什么意思。
括号里的数字的取值范围和单位是多少。
谢谢

public death() {
    new id=read_data(2)
    message_begin(MSG_ONE,get_user_msgid("ScreenFade"),{0,0,0},id)
    write_short( 10<<12 ) // fade lasts this long duration
    write_short( 10<<16 ) // fade lasts this long hold time
    write_short( 1<<1 ) // fade type (in / out)
    write_byte( 255 ) // fade red
    write_byte( 0 ) // fade green
    write_byte( 0 ) // fade blue
    write_byte( 255 ) // fade alpha
    message_end()
    new deadname
    get_user_name(id,deadname,32)
    set_hudmessage(255, 255, 255, -1.0, -1.0, 2, 0.2, 10.0, 0.1, 0.2, 2)
    show_hudmessage(id,"Thanks for trying %s, come again..", deadname)
    return PLUGIN_CONTINUE
}

Rulzy 发表于 2009-9-10 12:31:42

write_short()后面只不过是跟了一个短整形数,10<<16与write_short无相关联系。为什么写的是这个数据,那得查看ScreenFade这个事件的定义了。

cityhonghu 发表于 2009-9-10 13:49:36

你来了,太好了。下面的代码是O3的闪光时间部分。默认是1.5秒,如果我想改为5秒或者其他任意时间,要如何改呢?
public Flash(id) {
        message_begin(MSG_ONE,gMsgScreenFade,{0,0,0},id)
        write_short( 1<<15 )
        write_short( 1<<10 )
        write_short( 1<<12 )
        write_byte( 255 )
        write_byte( 255 )
        write_byte( 255 )
        write_byte( 255 )
        message_end()
        emit_sound(id,CHAN_BODY, "weapons/flashbang-2.wav", 1.0, ATTN_NORM, 0, PITCH_HIGH)
}

public plugin_init() {
   register_plugin("Admin Flash","1.0","AssKicR")
   register_concmd("amx_flash","admin_flash",ADMIN_LEVEL_A,"< Nick, UniqueID, #userid, @TEAM, or * > flashes selected client(s)")
   gMsgScreenFade = get_user_msgid("ScreenFade")
   return PLUGIN_CONTINUE
}

jiunnwoei2629 发表于 2009-9-10 14:16:54

http://wiki.amxmodx.org/index.php/Half-Life_1_Game_Events#ScreenFade
看看這個吧
裡面有詳細說明用法
這個比較基礎一點

cityhonghu 发表于 2009-9-10 21:13:52

谢谢,楼上的。可惜我看不懂英文。:dizzy:

jiunnwoei2629 发表于 2009-9-10 22:15:48

看不懂英文 可以翻譯阿= =

cityhonghu 发表于 2009-9-10 22:51:22

本帖最后由 cityhonghu 于 2009-9-10 22:54 编辑

翻译了一下,但是不敢确定是否正确。
write_short( 1<<15 )   这是效果持续时间?
write_short( 1<<10 )   这是效果冻结时间?冻结是什么意思?
write_short( 1<<12 )   这是玩家标记?

Note: Duration and HoldTime is in special units. 1 second is equal to (1<<12) i.e. 4096 units.

这是说明部分,是在说持续时间和冻结时间是特别单位。(1<<12)为1秒,最大4096单位 ?

如果我想设置为5秒,这样设置是否正确呢?(修改了第一行的write_short)public Flash(id) {
      message_begin(MSG_ONE,gMsgScreenFade,{0,0,0},id)
      write_short( 1<<60 )   //此部分由15改为60
      write_short( 1<<10 )
      write_short( 1<<12 )
      write_byte( 255 )
      write_byte( 255 )
      write_byte( 255 )
      write_byte( 255 )
      message_end()
      emit_sound(id,CHAN_BODY, "weapons/flashbang-2.wav", 1.0, ATTN_NORM, 0, PITCH_HIGH)
}

public plugin_init() {
   register_plugin("Admin Flash","1.0","AssKicR")
   register_concmd("amx_flash","admin_flash",ADMIN_LEVEL_A,"< Nick, UniqueID, #userid, @TEAM, or * > flashes selected client(s)")
   gMsgScreenFade = get_user_msgid("ScreenFade")
   return PLUGIN_CONTINUE
}

jim_yang 发表于 2009-9-11 18:08:10

我来给你解释一下吧,
void Flashbang_ScreenFade(CBaseEntity *pEntity, const vec3_t &color, float fadeTime, float fadeHold, int alpha, int flags)
{
        MESSAGE_BEGIN(MSG_ONE, MSGID_ScreenFade, NULL, pEntity->pev());
        WRITE_SHORT(UTIL_CLAMP_UNSIGNED_SHORT(int(fadeTime * (1<<12))));
        WRITE_SHORT(UTIL_CLAMP_UNSIGNED_SHORT(int(fadeHold * (1<<12))));
        WRITE_SHORT(flags);
        WRITE_BYTE((int)color->x);
        WRITE_BYTE((int)color->y);
        WRITE_BYTE((int)color->z);
        WRITE_BYTE(alpha);
        MESSAGE_END();
}
第一个是fadetime是你从现在的状态进入你要设置的屏幕状态的时间
第二个是fadehold是你设置的屏幕状态持续的时间
flags有四种:
0-淡入
1-淡出
2-不混合(新的与上一个不叠加效果)
4-持续
short最大值为0xFFFF

cityhonghu 发表于 2009-9-11 18:35:11

本帖最后由 cityhonghu 于 2009-9-11 18:38 编辑

非常感谢jim_yang。
以下代码是不是可以实现,在15/12秒之后效果生效,其效果为淡出并叠加效果 ?public Flash(id) {
      message_begin(MSG_ONE,gMsgScreenFade,{0,0,0},id)
      write_short( 1<<15 )   
      write_short( 1<<60 )
      write_short( 1<<1 )
      write_byte( 255 )
      write_byte( 255 )
      write_byte( 255 )
      write_byte( 255 )
      message_end()
      emit_sound(id,CHAN_BODY, "weapons/flashbang-2.wav", 1.0, ATTN_NORM, 0, PITCH_HIGH)
}

jim_yang 发表于 2009-9-11 18:47:47

12秒 12<<12
15秒 15<<12
页: [1] 2
查看完整版本: 求助,write_short函数使用方法(已解决)