Board logo

標題: [研究帖]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