
標題: [研究帖]SP寫法分析 (更新在#7) [打印本頁]
作者: leo221094 時間: 2011-9-15 14:53 標題: [研究帖]SP寫法分析 (更新在#7)
研究對象:國內插件寫手: Pan Xiaohai 於2011年9月5日發佈於Alliedmods的
Multiple Equipments 插件
http://forums.alliedmods.net/showthread.php?t=166580
這插件的作用嘛,就是給倖存者可以裝備2把主武器並能同時顯示於倖存者背上
切換方法就是當手持主武器時按實MOUSE右制再禁 "Q"
(註: 如主武器已經無子彈了可以實MOUSE右制再禁 "2,3,4,5, MOUSE滑輪上, 下" 任一來切換)
不過今日研究重點唔係呢個作用
只係想講下佢有D好實用既SCRIPTING提供比大家參考引用:
SwapInt(PrimaryAmmo[client], SecondaryAmmo[client]);
SwapInt(&a, &b)
{
new t=a;
a=b;
b=t;
}
呢個係將2個integer既value快速對調, 而且具有泛用性
簡單黎講就係將a既value save係t
再用b黎replace a
最後將t所保存既value replace番入去b度
呢個只係簡單原理, 重點係佢用 (&a, &b)
黎取代左以往讀integer時打既長串語法
我覺得非常唔錯 
引用:
SwapString(PrimaryName[client], SecondaryName[client]);
SwapString(String:a[LEN64], String:b[LEN64])
{
decl String:t[LEN64];
strcopy(t, LEN64, a);
strcopy(a, LEN64, b);
strcopy(b, LEN64, t);
}
而呢個係string既對調, 同樣係簡而精既例子
值得一學
第2回: #7
[ 本帖最後由 leo221094 於 2011-9-17 13:02 編輯 ]
作者: carlcarlto 時間: 2011-9-15 16:26
複製內容到剪貼板
代碼:
SwapString(PrimaryName[client], SecondaryName[client]);
SwapString(String:a[LEN64], String:b[LEN64])
{
decl String:t[LEN64];
strcopy(t, LEN64, a);
strcopy(a, LEN64, b);
strcopy(b, LEN64, t);
}will this looks better?
use 代碼
[ 本帖最後由 carlcarlto 於 2011-9-15 16:27 編輯 ]
作者: yin456 時間: 2011-9-15 19:42
正想要這插件
唔該~~~~
作者: apple_W 時間: 2011-9-16 00:51
我平時調轉valve都係咁樣寫= =
作者: hihi1210 時間: 2011-9-16 02:29
panxiaohai really has much time to write...
I have not.
作者: long3214 時間: 2011-9-16 12:15
我唔識寫插件
我淨係識漢化插件....
據我所知panxiaohai有好多人同佢合作寫插件,最近佢寫左好幾種有關witch既插件,都幾有創意
作者: leo221094 時間: 2011-9-17 12:51
接續
今次講下提取武器參數既寫法
由於IPVE個代碼顯示唔識自動換行我將部份代碼進行簡化複製內容到剪貼板
代碼:
GetClientWeaponInfo_l4d2(client , &ammo, &clip, &upgradeBit, &upammo)
{
new slot=0;
new ent=GetPlayerWeaponSlot(client, slot);
if ( ent> 0)
{
new String:weapon[32];
new ammoOffset = FindSendPropInfo("CTerrorPlayer", "m_iAmmo");
GetEdictClassname(ent, weapon, 32);
upgradeBit = GetEntProp(ent, Prop_Send, "m_upgradeBitVec");
upammo = GetEntProp(ent, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded");
clip = GetEntProp(ent, Prop_Send, "m_iClip1");
if (StrEqual(weapon, "weapon_rifle") || StrEqual(weapon, "weapon_rifle_sg552") ||
StrEqual(weapon, "weapon_rifle_desert")|| StrEqual(weapon, "weapon_rifle_ak47"))
ammo = GetEntData(client, ammoOffset+(12));
else if (StrEqual(weapon, "weapon_rifle_m60") )
ammo = GetEntData(client, ammoOffset+(12));
else if (StrEqual(weapon, "weapon_smg") || ......
}
}
首先要target左你要拎既player既client id
作者用client黎做代號
跟住作者開一個用GetPlayerWeaponSlot黎
取得slot 0 即係主武器位置既entity (題外話: slot 0-4 分別對應主武器,副武器, 投擲類, 醫療類 同 應急藥品類)
再用ent 黎儲起呢個value
new ent=GetPlayerWeaponSlot(client, slot);
有左呢個value就可以逐一查出呢把主武既相應參數了
第1樣:
複製內容到剪貼板
代碼:
upgradeBit = GetEntProp(ent, Prop_Send, "m_upgradeBitVec");
m_upgradeBitVec 武器有冇附加升級, 雖然我冇實際睇過個數值係乜
不過我估應該得2個可能 1 或者 0 , 即係有 或者 冇.
第2樣:
複製內容到剪貼板
代碼:
upammo = GetEntProp(ent, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded");
m_nUpgradedPrimaryAmmoLoaded 武器特殊彈藥(即白磷彈/沖擊彈)上膛彈量
第3樣:
複製內容到剪貼板
代碼:
clip = GetEntProp(ent, Prop_Send, "m_iClip1");
m_iClip1 武器上膛彈量
第4樣:
複製內容到剪貼板
代碼:
new ammoOffset = FindSendPropInfo("CTerrorPlayer", "m_iAmmo");GetEdictClassname(ent, weapon, 32); if (StrEqual(weapon, "weapon_rifle") || StrEqual(weapon, "weapon_rifle_sg552") || StrEqual(weapon, "weapon_rifle_desert") || StrEqual(weapon, "weapon_rifle_ak47")) { ammo = GetEntData(client, ammoOffset+(12)); } else if (StrEqual(weapon, "weapon_rifle_m60") ) { ammo = GetEntData(client, ammoOffset+(12)); } else if .....
呢個係指備彈數量, 由於不同武器備彈數量不同
所以要先用ammoOffset 黎保存基本m_iAmmo即儲存位置
再因應唔同種類武器加減ammoOffset 既位置
以成功獲取該武器既正確備彈數量
例子:
當你手上既武器係M16咁通過weapon name checking:
if (StrEqual(weapon, "weapon_rifle") || StrEqual(weapon, "weapon_rifle_sg552") || StrEqual(weapon, "weapon_rifle_desert") || StrEqual(weapon, "weapon_rifle_ak47"))
得出佢所屬武器既備彈類別後
就可以將佢ammoOffset 既位置 +(12)
取得備彈數量正確儲存位置後
再讀取佢既備彈數量
ammo = GetEntData(client, ammoOffset+(12));
以上4樣就係最常用既基本槍械參數了
下回會講點修改呢D參數
不過大部份只需要將get改做set就可以進行修改, 我只會略略咁講下比較複雜既例子
[ 本帖最後由 leo221094 於 2011-9-17 13:01 編輯 ]
作者: apple_W 時間: 2011-9-18 13:28
if (StrEqual(weapon, "weapon_rifle") || StrEqual(weapon, "weapon_rifle_sg552") || StrEqual(weapon, "weapon_rifle_desert") || StrEqual(weapon, "weapon_rifle_ak47"))
咁寫會唔會唔方便-_-
寫到咁長
| 歡迎光臨 IPvE vLan 遊戲平台|網吧系統 (https://www.ipve.com/bbs/) |
Powered by Discuz! 6.0.0 |