搜索
查看: 1988|回复: 9

coolzsb,又一个关于插件编译的问题

[复制链接]
发表于 2003-6-26 18:06:58 | 显示全部楼层 |阅读模式 来自 中国–湖北–武汉
coolzsb
今天编译MATCH_DELUXE插件遇到一些麻烦
很棘手。。。所以求助于你

我找到一个amx match manager的插件
他可以把比分显示以工具条的形式放到玩家的chat栏位置
玩家可以通过say info来选择打开或者关闭此工具栏,下面是那个功能的具体代码:

public toggle_scores(id)
{
        if ((is_user_bot(id))||(id==0)||(match_inprogress<1))
                return PLUGIN_CONTINUE
        if (match_info_off[id]) {
                match_info_off[id] = 0
                update_score(id)
                client_print(id,print_chat,"* [AMX MM] Match info is now on (say 'info' to turn it off).")
        }
        else {
                match_info_off[id] = 1
                message_begin( MSG_ONE, gmsgStatusText, {0,0,0}, id)
                write_byte(0)
                write_string("")
                message_end()
                client_print(id,print_chat,"* [AMX MM] Match info is now off (say 'info' to turn it back on).")
        }
        return PLUGIN_CONTINUE
}

public update_score(id)
{
        if ((is_user_bot(id))||(id==0)||(match_info_off[id])||(matchtype1 == 2))
                return PLUGIN_CONTINUE
        new status[64]
        if (match_inprogress == 0)
                format(status,63,"")
        if (match_inprogress == 1)
                format(status,63,"Warmup before 1st half")
        if ((match_inprogress == 2)||(match_inprogress == 5)) {
                if ((ct_score[1]+t_score[1])==matchtype2)
                        format(status,63,"%s (%i / %i) %s - 1st half finished",(cmdtype==1) ? clanCT : "CT",ct_score[1],t_score[1],(cmdtype==1) ? clanT : "Terrorist")
                else
                        format(status,63,"%s (%i / %i) %s - %i %s left",(cmdtype==1) ? clanCT : "CT",ct_score[1],t_score[1],(cmdtype==1) ? clanT : "Terrorist",(matchtype2-ct_score[1]-t_score[1]),((ct_score[1]+t_score[1])==(matchtype2-1)) ? "round" : "rounds")
                }
        if (match_inprogress == 3)
                format(status,63,"Warmup before 2nd half")
        if ((match_inprogress == 4)||(match_inprogress == 6)) {
                if (cmdtype==1) {
                        if ((ct_score[1]+t_score[1])==matchtype2)
                                format(status,63,"%s (%i / %i) %s - 2nd half finished",clanCT,(ct_score[0]+t_score[1]),(t_score[0]+ct_score[1]),clanT)
                        else
                                format(status,63,"%s (%i / %i) %s - %i %s left",clanCT,(ct_score[0]+t_score[1]),(t_score[0]+ct_score[1]),clanT,(matchtype2-ct_score[1]-t_score[1]),((ct_score[1]+t_score[1])==(matchtype2-1)) ? "round" : "rounds")
                        }
                else {
                        if ((ct_score[1]+t_score[1])==matchtype2)
                                format(status,63,"%s (%i / %i) %s - 2nd half finished","CT",(t_score[0]+ct_score[1]),(ct_score[0]+t_score[1]),"Terrorist")
                        else
                                format(status,63,"%s (%i / %i) %s - %i %s left","CT",(t_score[0]+ct_score[1]),(ct_score[0]+t_score[1]),"Terrorist",(matchtype2-ct_score[1]-t_score[1]),((ct_score[1]+t_score[1])==(matchtype2-1)) ? "round" : "rounds")
                        }
                }
        message_begin( MSG_ONE, gmsgStatusText, {0,0,0}, id)
        write_byte(0)
        write_string(status)
        message_end()
        return PLUGIN_CONTINUE
}


然后是新增加的注册命令:
        register_clcmd("say info","toggle_scores")
        register_clcmd("say_team info","toggle_scores")

其中大部分的函数与match_deluxe相同的,可以共用(因为作者本来就是在此插件基础上融合其他插件的功能修改出来的),后来编译的时候总是因为无效组件无法编译,于是我把前面的函数声明也加了进去
new match_info_off[33],SpecName[16],gmsgStatusText,gmsgSayText,gmsg_TeamInfo

这个是match manager插件的新的声明,我把SpecName[16],gmsgSayText,gmsg_TeamInfo等无用的(至少我在那段功能代码里没有看到使用)函数去掉了,最后终于编译成功了。
可是当我使用新的比赛插件的时候say info,服务器却down掉了
然后显示:L 06/26/2003 - 17:25:49: FATAL ERROR (shutting down): Tried to create a message with a bogus message type ( 0 )
试图产生一个不存在的信息(服务器关闭)
这次真是郁闷了,无语了,所以只好来求助了。。。
最后送上三个插件的代码,one is match manager, one is match_dluxe original code, and the other is match_deluxe edit version by becking :]
希望能够尽快得到答复,功能很小,但从中可以知道许多函数的功能和左右

PS: 最后以个问题new match_info_off[33]后面的[33]是虾米东西啊??为什么其他的new symbol后面的数字不一样呢?麻烦解释。。。:)thx。。。。
我没学过C所以这么多问题,^_^。。麻烦了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
 楼主| 发表于 2003-6-26 18:44:41 | 显示全部楼层 来自 中国–湖北–武汉
刚才终于发现问题所在了,忽视了一个产生message的函数^_^,如下
gmsgStatusText = get_user_msgid("StatusText")

把它加入到最后的命令声明,也就是public plugin_init()里就好了
可是新问题来了。。。。
info信息是可以通过say info信息打开关闭了,可是我希望他默认打开,而且始终打开,除非再执行say info 命令才关闭,为甚么我编译的插件默认并不打开toogle,打开以后一局结束后又关闭了?然后需要输入say info两次才再次打开。。。
郁闷。。迷惑
回复

使用道具 举报

 楼主| 发表于 2003-6-26 19:27:46 | 显示全部楼层 来自 中国–湖北–武汉
这里是问题的截图
左下角的地方就是那个我改编出来的分数toogle
苦恼啊。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
回复

使用道具 举报

发表于 2003-6-26 19:52:27 | 显示全部楼层 来自 中国–北京–北京
干吗的插件??
回复

使用道具 举报

 楼主| 发表于 2003-6-26 20:37:52 | 显示全部楼层 来自 中国–湖北–武汉
比赛插件
我准备把三个比赛插件的优点功能全部集中起来
回复

使用道具 举报

发表于 2003-6-26 21:47:28 | 显示全部楼层 来自 中国–福建–厦门

我仔细的解释一下怎么搞定的吧

不晓得becking有没有搞明白加上的这条语句的作用,既然你跑得快,我就在这里解释一下

register_event("ResetHUD","update_score","b")

这句语句一般都是放在plugin_init()的代码里面的
表示的是针对任意一个在游戏中的玩家在每一局重新开始的时候,执行updat_score这个函数的功能

之前之所以你需要在每一局都要输入say info才能完成你要的toogle显示是因为,你要的这个toogle显示属于StatusText的消息,这个消息在每一回合重新开始的时候都会被重置,所以需要在每一回合开始的时候重新把新的toogle写到画面中,这个功能是由update_score这个函数完成的,所以,就是这样一条语句就可以解决你遇到的问题了
回复

使用道具 举报

发表于 2003-6-26 22:08:49 | 显示全部楼层 来自 中国–广西–柳州
厉害,真是厉害(头,好大,好大)
回复

使用道具 举报

 楼主| 发表于 2003-6-27 12:03:13 | 显示全部楼层 来自 中国–湖北–武汉
感谢coolzsb的耐心指导,这个已经完工了,自我感觉还不错。。。
^_^。。
但是新问题来了,amx_war插件中有个选择开始overtime game的功能,也就是在双方平局以后,如果你的tiegame参数为0(此参数表示是否承认平局),则双方进入3+3的加时赛,而match_deluxe没有该功能,昨天想把该功能移植到match_deluxe插件上去,看了3个多小时的代码(这次终于体会到头好大好大的滋味了),头都大了还是没有什么头绪。。。。

cool能否有空的时候再帮帮忙
下面附上amx_war的源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
回复

使用道具 举报

发表于 2003-6-27 12:08:40 | 显示全部楼层 来自 中国–广西–柳州
支持,大大的支持(头,好大好大):)
回复

使用道具 举报

发表于 2003-6-27 12:59:32 | 显示全部楼层 来自 中国–上海–上海
[33]表示是一个33长度的数组
通常字符串是用字符数组来表示的,"helloworld"是一个字符串,共10个字符,加上最后的结尾符(ascii码0),是一个长度11的字符数组
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表