终于完成了消音器的脚本。极有想死的感觉。
大概这就是我小时候曾经幻想过的程序员的生活吧。小时候总是觉得,与电脑沟通比与人沟通是要高级很多倍的。
这种沟通原来戏剧性地充满了大喜和大悲。嗯,我想,和吸毒的感觉应该差不多。
你可以蓬头垢面胡子拉扎,桌子上倒扣着泡面盒,地上滚动着薯片筒子,三天没洗的衣服堆满沙发,而你就这么无动于衷地花一整天坐在电脑前,就因为一个字符串的显示不正确;
而在那个午夜,当终于发现调试中的程序不再出错,并如我所愿地得出正确结果时,我居然极其变态地鼓起掌来。你可以想象,三更半夜有一个人眉飞色舞地对着空气鼓掌!那是怎样的一种精神病?
与电脑沟通是困难的。这不仅难在你不知道它在说什么,更难在它也不知道你在说什么。如果仅仅是前者,你只需要一字一句地把那段提示抄下来,勤奋地翻翻教科书和字典,复习一下数学公式,总会明白;但对于后者,你却无能为力。因为你既不能提高计算机的理解能力,也很难立即提高自己的表达能力,有些语法你没法凭空想象出来,不知道就是不知道,你也没法查词典教材--因为你不知道你不知道什么。
感谢上帝的是,经过了大半个月的研究,我终于写完了消音器脚本,而且还附带写了个挖散兵坑的脚本。然而胜利的喜悦很快就消散无踪,我却像上瘾一般地再度扎进下一个课题。为什么明知痛苦大于快乐,程序员还是会选择继续写下去呢?
;//Tan's PistolSkill.sqs
_soldier = _this select 0
_OddMagList = magazines _soldier
_OddMagSum = count _OddMagList
_PistolMagOdd = 0
_CountTime = 0
_MagAdd = 0
_soldier playmove "HandgunCrouchReloadMagazine"
~1
?(_soldier hasWeapon "1911") : goto "1911sd"
?(_soldier hasWeapon "1911sd") : goto "1911"
?(_soldier hasWeapon "m9") : goto "m9sd"
?(_soldier hasWeapon "m9sd") : goto "m9"
?(_soldier hasWeapon "p228") : goto "p228sd"
?(_soldier hasWeapon "p228sd") : goto "p228"
?(_soldier hasWeapon "g17") : goto "g17sd"
?(_soldier hasWeapon "g17sd") : goto "g17"
#1911sd
_OldPistolName = "1911"
_OldMagName = "LSR_M1911Mag"
_OldMagCapa = 7
_NewPistolName = "1911sd"
_NewMagName = "LSR_M1911sdMag"
_NewMagCapa = 7
goto "CountMagOdd"
#1911
_OldPistolName = "1911sd"
_OldMagName = "LSR_M1911sdMag"
_OldMagCapa = 7
_NewPistolName = "1911"
_NewMagName = "LSR_M1911Mag"
_NewMagCapa = 7
goto "CountMagOdd"
#m9sd
_OldPistolName = "M9"
_OldMagName = "LSR_m9mag"
_OldMagCapa = 15
_NewPistolName = "M9SD"
_NewMagName = "LSR_m9SDMag"
_NewMagCapa = 15
goto "CountMagOdd"
#m9
_OldPistolName = "M9SD"
_OldMagName = "LSR_m9SDMag"
_OldMagCapa = 15
_NewPistolName = "M9"
_NewMagName = "LSR_m9mag"
_NewMagCapa = 15
goto "CountMagOdd"
#p228sd
_OldPistolName = "P228"
_OldMagName = "LSR_p228mag"
_OldMagCapa = 15
_NewPistolName = "P228SD"
_NewMagName = "LSR_P228sdMag"
_NewMagCapa = 15
goto "CountMagOdd"
#p228
_OldPistolName = "P228SD"
_OldMagName = "LSR_P228sdMag"
_OldMagCapa = 15
_NewPistolName = "P228"
_NewMagName = "LSR_p228mag"
_NewMagCapa = 15
goto "CountMagOdd"
#g17sd
_OldPistolName = "G17"
_OldMagName = "Glock"
_OldMagCapa = 14
_NewPistolName = "G17SD"
_NewMagName = "SJB_TOS_Glock17c_sd_mag"
_NewMagCapa = 14
goto "CountMagOdd"
#g17
_OldPistolName = "G17SD"
_OldMagName = "SJB_TOS_Glock17c_sd_mag"
_OldMagCapa = 14
_NewPistolName = "G17"
_NewMagName = "Glock"
_NewMagCapa = 14
goto "CountMagOdd"
#CountMagOdd
;//原来采用的是DanTong的脚本来计算指定弹夹数
;//?((_OddMagList select _CountTime) != _OldMagName) : goto "CountTime"
;//_PistolMagOdd = _PistolMagOdd + 1
;//#CountTime
;//_CountTime = _CountTime + 1
;//?(_CountTime > _OddMagSum ) : goto "PistolExchange"
;//goto "CountMagOdd"
;//后来经过简化,一句话解决:
;//剩余弹夹数=原所有弹夹中与指定弹夹相符的数量
_PistolMagOdd = "_x == _OldMagName" count _OddMagList
#PistolExchange
;//显示剩余弹夹数,仅用于测试
;//hint format[{%1}, _PistolMagOdd]
;//弹夹数显示1秒才跳入下一个显示
;//~1
;//Ammo语句接武器名,而不是接弹夹名
;//_ammoOdd = _soldier Ammo _OldMagName
;//当前弹夹的剩余弹量
_ammoOdd = _soldier Ammo _OldPistolName
;//显示剩余弹量,仅用于测试
hint format[{%1},_ammoOdd]
;//移除操作前的武器
_Soldier removeWeapon _OldPistolName
;//移除操作前的剩余弹夹
_Soldier removeMagazines _OldMagName
#CheckNewMag
;//?(_PistolMagOdd == 1) : goto "AddGun"
;//如果新加弹夹未达到原剩余弹夹数,且操作前未打光弹夹,则继续添加新弹夹
?((_PistolMagOdd > _MagAdd) and (_ammoOdd != 0)) : goto "AddNewMag"
;//如果操作前打光弹夹,则新加弹夹应比原剩余弹夹少一个(空弹夹不需替换新弹夹),如不足则继续添加新弹夹
?((_PistolMagOdd-1 > _MagAdd) and (_ammoOdd == 0)) : goto "AddNewMag"
;//#addGun
;//操作者更换操作后的武器
_soldier AddWeapon _NewPistolName
;//操作者继续手持操作后的武器
_soldier selectWeapon _NewPistolName
exit
#AddNewMag
;//操作者增加一个新弹夹
_soldier AddMagazine _NewMagName
;//脚本将弹夹数的增加记录在案
_MagAdd = _MagAdd + 1
;//检查新增弹夹数是否达标
goto "CheckNewMag"
以上脚本需要在config中定义eventhandler:
class man... ...
class eventhandler... ...
class PistolSD
{
displayName="Pistol Sound depressor";
position="pos driver";
radius=0.1;
condition="alive this && (this hasweapon ""1911"") || (this hasweapon ""1911sd"") || (this hasweapon ""m9"") || (this hasweapon ""m9sd"") || (this hasweapon ""p228"") || (this hasweapon ""p228sd"") || (this hasweapon ""g17"") || (this hasweapon ""g17sd"") ";
statement="[this,(primaryWeapon this)] exec ""/Tan_weaponSkill/PistolSkill.sqs"" ";
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;// Tan's ShovelSkill.sqs
;//定义使用工兵铲的人叫"_man"
_man = _this select 0
;//定义挖掘记数器初始指数为0
_digTimes = 0
;//建立挖掘动作循环起始点:
#keepWorking
;//"_man"做出挖掘动作:
_man playmove "CombatStrokeGun"
;//挖掘计数器增加1
_digTimes = _digTimes + 1
~1
;//挖掘5次
?(_digTimes < 5):goto "keepWorking"
;//散兵坑出现:
;//"Vehicle" CREATEVEHICLE [x,y,z]
"ORSComPos" CreateVehicle [GetPos _man select 0,GetPos _man select 1,0]
exit
以上脚本需要在config中定义eventhandler:
class man... ...
class eventhandler... ...
class foxhole
{
displayName="Dig a foxhole";
position="pos driver";
radius=0.1;
condition="(this hasweapon ""slx_shovel"") || (this hasweapon ""SLX_Shovel_East"") || (this hasweapon ""SLX_Shovel_East_Item"") || (this hasweapon ""SLX_Shovel_Anim"") || (this hasweapon ""SLX_ShovelBase"") || (this hasweapon ""SLX_ShovelStroke"") && alive this ";
statement="[this] exec ""/Tan_weaponSkill/shovelSkill.sqs"" ";
};