Osker Lee 发表于 2010-12-23 01:12:34

公布CS1.6记分牌插件的源代码,大家研究研究怎么修复BUG?

本帖最后由 Osker Lee 于 2010-12-23 14:04 编辑

由于Kone发布的CS1.6记分牌插件(score.amxx)没有公开源代码,而且这个人最近好像也不在MOD论坛活动了,所以找他要源代码也不太现实。求人不如求己,最近折腾了两天,结合CS1.6广告牌插件和普通记分牌插件的源代码,我自己写了一个记分牌插件,和Kone发布的记分牌插件差不多。之前Ethan也发布过一个记分牌插件,但我的这个记分牌插件的源代码与Ethan的不一样,对比一下我和他的源代码就知道了。他那个是以spr的形式显示图像的,我的则是以tga的形式显示的,二者原理不一样。

但是我的这个插件和Kone的一样都存在之前的BUG:即与CS系统自身的杀敌提示冲突,导致杀敌数据无法在游戏屏幕的右边显示。(如图,插件是用AMXMODX1.8.1和1024*768这个游戏分辨率进行测试的。)

下面我公布一下插件和源代码,大家一块研究研究,集所有人的智慧,群策群力,我相信总会把BUG修复的。
#include <amxmodx>
#include <amxmisc>

#define PLUGIN_NAME "Team Score"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_AUTHOR "Osker Lee"

new iTeamScore

public plugin_init()
{
      register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
      register_event("HLTV", "NewRound", "a", "1=0", "2=0")
      register_event("TeamScore", "Event_TeamScore", "a" )
}

public plugin_precache()
{
      precache_generic("gfx/career/round_corner_nw.tga")
      precache_generic("resource/TutorScheme.res")
      precache_generic("resource/UI/TutorTextWindow.res")
}

public Event_TeamScore()
{
      new iTeam
      read_data(1, iTeam, 1)
      iTeamScore[(iTeam=='C')?1:0] = read_data(2)
      return PLUGIN_CONTINUE
}

public NewRound()
{
      for (new id = 1; id < get_maxplayers(); id++)
      {
                static iMsg
                format(iMsg, 127, "^n%d                                    %d", iTeamScore, iTeamScore)
                Create_Show(id, iMsg)
      }
}

stock Create_Show(id, iMsg[])
{
      message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("TutorText"), {0, 0, 0}, id)
      write_string(iMsg)
      write_byte(0)
      write_short(0)
      write_short(0)
      message_end()
}

homework 发表于 2010-12-23 11:16:07

本帖最后由 homework 于 2010-12-23 11:26 编辑

沙发,顶起,虽然我不懂源码,但是楼主的共享精神绝对值得称赞,谢谢。。。

测试结果 如图:


所有文件都放在服务器端的,客户端进去不下载相关文件,是不是要把TutorScheme.res这些文件放在客户端相应目录呢。

landyhsu 发表于 2010-12-23 11:38:20

由于我玩1.5,因此下面HUD显示不冲突未测试....
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "Team Score"
#define VERSION "1.0"
#define AUTHOR "Osker Lee"

new ct_score, terrorist_score
new g_MsgTutor
new const g_TutorPrecache[][] = { "gfx/career/round_corner_nw.tga", "resource/TutorScheme.res", "resource/UI/TutorTextWindow.res" }

new g_MyMsgSync

public plugin_init() {
      register_plugin(PLUGIN,VERSION,AUTHOR)
      register_event("TeamScore","team_score", "a")
        set_task(1.0,"score_round",_,_,_,"b")
      register_event("HLTV", "NewRound", "a", "1=0", "2=0")
      g_MsgTutor = get_user_msgid("TutorText")
      g_MyMsgSync = CreateHudSyncObj()
}
public plugin_precache()
{
      new i
      for(i = 0; i < sizeof g_TutorPrecache; i++)
      {      
      precache_generic(g_TutorPrecache)
      }
}
public score_round()
{
      set_hudmessage(255, 255, 255, -1.0, 0.02, 0, 0.5, 2.0, 0.08, 2.0, -1);
                  ShowSyncHudMsg(0,g_MyMsgSync,"%d                              ", terrorist_score);
               
      set_hudmessage(255, 255, 255, -1.0, 0.02, 0, 0.5, 2.0, 0.08, 2.0, -1);
        ShowSyncHudMsg(0,g_MyMsgSync,"                           %d", ct_score);
}

public NewRound()
{
      for (new id = 1; id < get_maxplayers(); id++)
{
      new Text[ 100 ]
      MakeTutor(id, Text)
      return PLUGIN_CONTINUE   
}      
      return PLUGIN_CONTINUE   
}
stock MakeTutor(id,Text[]){
      
      message_begin(MSG_ONE_UNRELIABLE,g_MsgTutor,_,id)
      write_string(Text)
      write_byte(0)
      write_short(0)
      write_short(0)
      message_end()
}
public tutorek(id)
{
      new Text[ 100 ]
      MakeTutor(id, Text)
      return PLUGIN_CONTINUE   
}
public team_score()
        {
        new team;
        read_data(1,team,31);
        if (equal(team,"CT"))
        {
      ct_score = read_data(2);
        }
        else if (equal(team,"TERRORIST"))
        {
        terrorist_score = read_data(2);
        }
}

rsdtt 发表于 2010-12-23 13:49:59

set_hudmessage使用不科学
没必要封开两个显示道,这样只会浪费,显示道只有4个,只要不重复即可
不过你说的那种效果图暂不清楚


set_hudmessage - Sets the format for a HUD message

Syntax:
   set_hudmessage ( red=200, green=100, blue=0, Float:x=-1.0, Float:y=0.35, effects=0, Float:fxtime=6.0, Float:holdtime=12.0, Float:fadeintime=0.1, Float:fadeouttime=0.2, channel=4 )
Type:
    Native
Notes:
There are 4 hud channels pr player. This means you can send a 2 diffrent messages to player a & b via channel 1.

Use index 0 if you want to send a message to everyone.
Use show_hudmessage to show the message.

effects types:
0 = fade in/fade out
1 = flickery credits
2 = write out (training room)

Plugins that can be helpfull.
This plugin allows you to easly change the pos/color of a hud message:
http://forums.alliedmods.net/showthread.php?p=19439

Note - as of AMX Mod X 1.61, setting the channel to -1 will automatically choose the next available HUD channel for a player.

Osker Lee 发表于 2010-12-23 13:57:02

本帖最后由 Osker Lee 于 2010-12-23 14:14 编辑

嗯,我又精简了一下,取消set_hudmessage改用format了,这下效果和Kone的记分牌插件一样了,参见一楼的源代码。

Osker Lee 发表于 2010-12-23 17:04:17

CSOL的记分牌就不存在这个BUG,不知道是用插件还是第三方程序实现的,还得继续研究研究。

rsdtt 发表于 2010-12-23 17:07:21

CSOL的记分牌就不存在这个BUG,不知道是用插件还是第三方程序实现的,还得继续研究研究。
Osker Lee 发表于 2010-12-23 17:04 http://www.dt-club.net/forum/images/common/back.gif
我看不像是AMXX的问题

暧昧 发表于 2012-10-5 06:59:14

Lz已经很厉害了,加qq,互加736119146

xuqiang5213 发表于 2013-11-15 10:53:27

不好修复啊。
页: [1]
查看完整版本: 公布CS1.6记分牌插件的源代码,大家研究研究怎么修复BUG?