设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4530|回复: 82

【教程】你们不要再欺负学姐了啦,GIBS自定义残肢系统教程   [复制链接]

Rank: 5Rank: 5

帖子
131
精华
0
声望
867 点
金币
133 Mold
被赞许
10 次
注册时间
2010-12-31
发表于 2012-3-21 20:45:15 |显示全部楼层
本帖最后由 MapleRabbit.VS 于 2012-3-22 14:22 编辑

前言:
      本人一枚学生党,实在是没有太多的时间,所以以下如果有错误请谅解,并欢迎各种指正~
      由于这不是面向入门者的教程,以下可能不会有完整的代码段,这一点也是因为时间有限,还请大家多多包涵,如果觉得文章不错,请在底下回复,您的支持是写教程者最大的动力

好了,话不多说,进入正题。

桌子会被砍碎,西瓜能被切成两半,这些都是GIBS系统的实现。关于GIBS在一般模型中的实现,由于不在本文的讨论范围内,就不多说了,那么本文将关注于如何在玩家上实现。

大概的思路如下
首先是勾取玩家的死亡事件,这是条件
SDK思路
  1. void CHL2MP_Player::Event_Killed( const CTakeDamageInfo &info )//玩家的死亡事件方法
复制代码
SourceMod思路
  1. public OnPluginStart()
  2. {
  3.         HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre)//在此事件下Pre/Post按理说没有什么区别
  4. }
复制代码
勾住玩家死亡的事件之后,你可以进行一些判断,如,是否玩家被炸死,是否被爆头,之类的代码
这都与事件系统有关,这里就不介绍了
接下来需要实现的是,肢体部分
这里分为几种情况,一种是尸体比较完整,一种是比较碎的情况
后者比较容易解决,简单的放置几个GIBS就可以了,而前者,则需要进一步的修改

直接修改模型貌似是不行的,玩家模型这里已经不起作用了
经过试验,勾住产生布娃娃的函数没有作用。。。具体原因。。不知道。。
怀疑是从属关系有问题,但是貌似也不行

最后只好用遍历的方法,对于在这样低频的条件下,遍历实体也不是一件很昂贵的事情
比如说头被打掉了
  1. //伪代码
  2. 实体 = 遍历搜索实体("hl2mp_ragdoll");
  3. 你的判断()
  4. {
  5.           设置模型(实体);
  6. }
  7. 放置GIBS(头模型);
复制代码
这样可以保证在布娃娃系统仍然有效的情况下产生GIBS
注意:如果你用于CSS,请把"hl2mp_ragdoll"换成CSS中的布娃娃实体名称

如果你想把玩家切成两半,也可以用同样的方法新建一个ragdoll实体
  1. //伪代码
  2. 实体 = 遍历搜索实体("hl2mp_ragdoll");
  3. 你的判断()
  4. {
  5.           设置模型(实体);
  6. }
  7. 通过名称来创建实体("hl2mp_ragdoll");
复制代码
以上可能用到的sourcemod函数(很久没用对sourcemod已经不是很熟,以下来自sourcemod查询到的结果)
  1. native FindEntityByClassname(startEnt, const String:classname[]);//通过实体名来寻找实体
  2. native CreateEntityByName(const String:classname[], ForceEdictIndex=-1);//通过实体名来创建实体
  3. native SetEntityModel(entity, const String:model[]);//设置模型(别忘了缓冲哦)
复制代码
但是,貌似在SourceMod中没有提供GIBS的借口,没关系,我们可以仿制一个;
原SDK代码如下
  1. void CGib::SpawnSpecificGibs(        CBaseEntity*        pVictim,
  2.                                                                 int                                nNumGibs,
  3.                                                                 float                        vMinVelocity,
  4.                                                                 float                        vMaxVelocity,
  5.                                                                 const char*                cModelName,
  6.                                                                 float                        flLifetime)
  7. {
  8.         for ( int i = 0; i < nNumGibs; i++ )
  9.         {
  10.                 CGib *pGib = CREATE_ENTITY( CGib, "gib" );
  11.                 pGib->Spawn( cModelName, flLifetime );
  12.                 pGib->m_nBody = i;
  13.                 pGib->InitGib( pVictim, vMinVelocity, vMaxVelocity );
  14.                 pGib->m_lifeTime = flLifetime;

  15.                 if ( pVictim != NULL )
  16.                 {
  17.                         pGib->SetOwnerEntity( pVictim );
  18.                 }

  19.                 //如果玩家着火了,也点燃GIBS
  20.                 if ( pVictim->GetFlags() & FL_ONFIRE )
  21.                 {
  22.                         pGib->Ignite( ( flLifetime - 1 ), false );
  23.                 }
  24.         }
  25. }
复制代码
用SourceMod仿制的思路
  1. //没什么特别的,即使写的和这个函数不一样也行,首先创建一个模型,实体类型设置为物理,然后根据死掉的玩家赋予一定的初速度就可以了
  2. //可能用到的函数
  3. //参见SourceMod的entity包即可
复制代码
最后是很短的完整代码(for SDK)
  1.                 const char *pszCurrentModelName = STRING(CHL2MP_Player::GetModelName());//获取模型名
  2.                 if(info.GetDamageType() == DMG_HEAVY && Q_strcmp(pszCurrentModelName,"models/character/mami/mami.mdl")==0)//如果受到重武器伤害并且是学姐
  3.                 {
  4.                         CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/character/mami/gibs/head.mdl", 5 );//放置头
  5.                         CBaseEntity* pResult = gEntList.FindEntityByClassname(NULL,"hl2mp_ragdoll");//寻找布娃娃实体
  6.                         while (pResult)
  7.                         {
  8.                                 CHL2MPRagdoll* pRGD = dynamic_cast<CHL2MPRagdoll*>(pResult);
  9.                                 if (pRGD)
  10.                                         pRGD->SetModel("models/character/mami/gibs/mami_body.mdl");//改变身体模型

  11.                                 pResult = gEntList.FindEntityByClassname(pResult,"hl2mp_ragdoll");
  12.                         }
  13.                 }
复制代码
第二步,准备模型。这个就不多说了

最终,你将得到以下的效果

悄悄滴靠近,打枪滴不要
a.jpg

会如何呢?留个悬念,回复后可见
游客,如果您要查看本帖隐藏内容请回复
I am the bone of my Scripts,
So I pray, Unlimited Code Works.

使用道具 举报

Rank: 5Rank: 5

帖子
321
精华
0
声望
1073 点
金币
115 Mold
被赞许
0 次
注册时间
2011-8-14
发表于 2012-3-21 20:57:35 |显示全部楼层
很期待,但是看不懂,还要谢谢lz的工作。。

使用道具 举报

Rank: 5Rank: 5

帖子
131
精华
0
声望
867 点
金币
133 Mold
被赞许
10 次
注册时间
2010-12-31
发表于 2012-3-21 20:59:49 |显示全部楼层
chuzuche 发表于 2012-3-21 20:57
很期待,但是看不懂,还要谢谢lz的工作。。

先看些SourceMod入门慢慢就懂了
I am the bone of my Scripts,
So I pray, Unlimited Code Works.

使用道具 举报

Honorary Member

冇有模型的斑竹

Rank: 7Rank: 7Rank: 7

帖子
2870
精华
0
声望
14751 点
金币
255 Mold
被赞许
195 次
注册时间
2011-6-15

MTT职员 可爱小猫 懒人勋章 Modchina灌水王

发表于 2012-3-21 21:04:20 |显示全部楼层
学姐是谁,求解,嘻嘻

点评

mmbnjh  魔法少女小圆里面的 巴麻美学姐  发表于 2012-3-22 12:27:17

使用道具 举报

Rank: 5Rank: 5

帖子
297
精华
0
声望
895 点
金币
144 Mold
被赞许
1 次
注册时间
2011-6-1
发表于 2012-3-21 21:05:22 |显示全部楼层
如何看懂...

使用道具 举报

Rank: 5Rank: 5

帖子
131
精华
0
声望
867 点
金币
133 Mold
被赞许
10 次
注册时间
2010-12-31
发表于 2012-3-21 21:09:39 |显示全部楼层
284658715 发表于 2012-3-21 21:04
学姐是谁,求解,嘻嘻

被砍的那个就是
I am the bone of my Scripts,
So I pray, Unlimited Code Works.

使用道具 举报

Rank: 2

帖子
28
精华
0
声望
42 点
金币
16 Mold
被赞许
0 次
注册时间
2011-10-7
发表于 2012-3-21 21:19:05 |显示全部楼层
目测学姐头......

使用道具 举报

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

帖子
618
精华
0
声望
6961 点
金币
3181 Mold
被赞许
92 次
注册时间
2009-7-26

黑暗使者 懒人勋章 可爱小猫 星界财团

发表于 2012-3-21 21:40:45 |显示全部楼层
巴麻美學姐←_←

使用道具 举报

Modchina声望-崇拜

在逃模客

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

帖子
2536
精华
0
声望
8050 点
金币
1500 Mold
被赞许
120 次
注册时间
2010-2-7

懒人勋章

发表于 2012-3-22 00:01:15 |显示全部楼层
起源布娃娃系统详解
その一   いつもと违う髪形に気が付くこと
その二   ちゃんと靴まで见ること   いいね?
その三   わたしの一言には三つの言叶で返

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
1250
精华
0
声望
3577 点
金币
470 Mold
被赞许
45 次
注册时间
2010-7-13

可爱小猫

发表于 2012-3-22 06:24:14 |显示全部楼层
pre是事件发生前,post是事件发生后。
例如playerthink里面弄超级跳,pre的话,超级跳没问题,原始跳被替换。
post的话,你按跳按到原始跳落地后才能进行超级跳。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部