111
This commit is contained in:
387
character/Swordman/WeaponMaster/Meteorsword.nut
Normal file
387
character/Swordman/WeaponMaster/Meteorsword.nut
Normal file
@@ -0,0 +1,387 @@
|
||||
/*
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
function checkExecutableSkill_meteorsword(obj) {
|
||||
if (!obj) return false;
|
||||
local isUse = obj.sq_IsUseSkill(235);
|
||||
if (isUse) {
|
||||
obj.sq_IsEnterSkillLastKeyUnits(235); //允许长按
|
||||
|
||||
|
||||
obj.sq_IntVectClear(); //清除人物子状态
|
||||
obj.sq_IntVectPush(0); //向人物子状态0号位 push 数据 0
|
||||
obj.sq_AddSetStatePacket(235, STATE_PRIORITY_USER, true); //将人物写入 235号 主状态
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function checkCommandEnable_meteorsword(obj) {
|
||||
if (!obj) return false;
|
||||
local chrstate = obj.sq_GetState(); //获取人物主状态
|
||||
|
||||
if (chrstate == STATE_STAND) //if 人物主状态为站立 返回真
|
||||
return true;
|
||||
|
||||
if (chrstate == STATE_ATTACK) //if 人物主状态为攻击中 state 8
|
||||
{
|
||||
return obj.sq_IsCommandEnable(235); //返回 是否允许按下235号技能按键的 布尔值
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function onProcCon_meteorsword(obj) {
|
||||
local bDownKey = obj.isDownSkillLastKey();
|
||||
local stateTimer = obj.sq_GetStateTimer();
|
||||
local RootTable = getroottable();
|
||||
|
||||
if (Chr_State_Table[0] == 0) {
|
||||
if (!bDownKey) {
|
||||
obj.sq_IntVectClear(); //清除人物子状态
|
||||
obj.sq_IntVectPush(3); //向人物子状态0号位 push 数据 0
|
||||
obj.sq_AddSetStatePacket(235, STATE_PRIORITY_USER, true); //将人物写入 235号 主状态
|
||||
} else if (stateTimer >= 800) {
|
||||
obj.sq_IntVectClear(); //清除人物子状态
|
||||
obj.sq_IntVectPush(2); //向人物子状态0号位 push 数据 0
|
||||
obj.sq_AddSetStatePacket(235, STATE_PRIORITY_USER, true); //将人物写入 235号 主状态
|
||||
}
|
||||
return;
|
||||
} else if (Chr_State_Table[0] == 2) {
|
||||
if (!bDownKey) {
|
||||
obj.sq_IntVectClear(); //清除人物子状态
|
||||
obj.sq_IntVectPush(4); //向人物子状态0号位 push 数据 0
|
||||
obj.sq_AddSetStatePacket(235, STATE_PRIORITY_USER, true); //将人物写入 235号 主状态
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function createEff_meteorsword(obj, ani, X, Y, Z, B) {
|
||||
local ani = sq_CreateAnimation("", ani);
|
||||
local pooledObj = sq_CreatePooledObject(ani, B);
|
||||
pooledObj.setCurrentPos(X, Y, Z);
|
||||
pooledObj.setCurrentDirection(obj.getDirection());
|
||||
sq_AddObject(obj, pooledObj, 2, false);
|
||||
|
||||
return pooledObj;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function onSetState_meteorsword(obj, state, datas, isResetTimer) {
|
||||
|
||||
if (!obj) return;
|
||||
obj.sq_StopMove(); //停止移动
|
||||
|
||||
obj.getVar("meteorsword").clear_vector();
|
||||
local RootTable = getroottable();
|
||||
|
||||
|
||||
if (Chr_State_Table[0] == 0) {
|
||||
local Direction = obj.getDirection();
|
||||
obj.sq_SetCurrentAnimation(124);
|
||||
|
||||
local montab = GameC.findRoundNearAllEnemyRect(obj, 340, 80, Direction);
|
||||
if (montab.len() > 0) {
|
||||
foreach(Monobj in montab) {
|
||||
if (!CNSquirrelAppendage.sq_IsAppendAppendage(Monobj, "character/swordman/weaponmaster/ap_meteorsword.nut")) {
|
||||
local append = CNSquirrelAppendage.sq_AppendAppendage(Monobj, obj, -1, true, "character/swordman/weaponmaster/ap_meteorsword.nut", false);
|
||||
CNSquirrelAppendage.sq_AppendAppendageID(append, Monobj, obj, 235, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (Chr_State_Table[0] == 2) {
|
||||
obj.sq_SetCurrentAnimation(125);
|
||||
|
||||
GameC.RemoveObjectAppend(obj, "character/swordman/weaponmaster/ap_meteorsword.nut");
|
||||
} else if (Chr_State_Table[0] == 3) {
|
||||
obj.sq_SetCurrentAnimation(126);
|
||||
} else if (Chr_State_Table[0] == 4) {
|
||||
obj.sq_SetCurrentAnimation(126);
|
||||
|
||||
obj.sq_SendCreatePassiveObjectPacket(2022100901, 0, 200, 1, 0);
|
||||
createEff_meteorsword(obj, "passiveobject/sqr_po/swordman/animation/meteorsword/up_meteorsword_shock1.ani", sq_GetDistancePos(obj.getXPos(), obj.getDirection(), 200), obj.getYPos(), obj.getZPos(), true);
|
||||
createEff_meteorsword(obj, "character/swordman/animation/yosin/meteorsword/up.ani", sq_GetDistancePos(obj.getXPos(), obj.getDirection(), 0), obj.getYPos(), obj.getZPos(), true);
|
||||
sq_SetShake(obj, 6, 1000);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function onEndCurrentAni_meteorsword(obj) {
|
||||
if (!obj) return;
|
||||
|
||||
if (Chr_State_Table[0] == 1) {
|
||||
obj.sq_IntVectClear(); //清除人物子状态
|
||||
obj.sq_IntVectPush(3); //向人物子状态0号位 push 数据 0
|
||||
obj.sq_AddSetStatePacket(235, STATE_PRIORITY_USER, true); //将人物写入 235号 主状态
|
||||
} else if (Chr_State_Table[0] == 3) {
|
||||
local attackBonusRate = obj.sq_GetBonusRateWithPassive(235, 235, 5, 2.0);
|
||||
|
||||
obj.sq_StartWrite(); //开始写入
|
||||
obj.sq_WriteDword(235); //写入 4 字节数 技能ID
|
||||
obj.sq_WriteDword(40); //写入 4 字节数 掉落范围
|
||||
obj.sq_WriteDword(20); //写入 4 字节数 掉落数量
|
||||
obj.sq_WriteDword(1); //写入 4 字节数 当前计数
|
||||
obj.sq_WriteDword(attackBonusRate); //写入 4 字节数 atk
|
||||
obj.sq_WriteDword(0); //写入 4 字节数 是否满蓄力
|
||||
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_USER, true);
|
||||
local POSxadd = sq_GetDistancePos(0, obj.getDirection(), 200); //设置落剑中点
|
||||
obj.sq_WriteDword(obj.getXPos() + POSxadd); //释放的时候的坐标
|
||||
obj.sq_WriteDword(obj.getYPos()); //释放的时候的坐标
|
||||
obj.sq_SendCreatePassiveObjectPacket(24370, 0, 200, 0, 0);
|
||||
} else if (Chr_State_Table[0] == 4) {
|
||||
local attackBonusRate = obj.sq_GetBonusRateWithPassive(235, 235, 5, 2.0);
|
||||
|
||||
|
||||
obj.sq_StartWrite(); //开始写入
|
||||
obj.sq_WriteDword(235); //写入 4 字节数 技能ID
|
||||
obj.sq_WriteDword(40); //写入 4 字节数 掉落范围
|
||||
obj.sq_WriteDword(20); //写入 4 字节数 掉落数量
|
||||
obj.sq_WriteDword(1); //写入 4 字节数 当前计数
|
||||
obj.sq_WriteDword(attackBonusRate); //写入 4 字节数 atk
|
||||
obj.sq_WriteDword(1); //写入 4 字节数 是否满蓄力
|
||||
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_USER, true);
|
||||
local POSxadd = sq_GetDistancePos(0, obj.getDirection(), 200); //设置落剑中点
|
||||
obj.sq_WriteDword(obj.getXPos() + POSxadd); //释放的时候的坐标
|
||||
obj.sq_WriteDword(obj.getYPos()); //释放的时候的坐标
|
||||
obj.sq_SendCreatePassiveObjectPacket(24370, 0, 200, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
function setCustomData_po_Swordman_meteorsword(obj, receiveData) {
|
||||
local px = receiveData.readDword(); //掉落范围
|
||||
local downnum = receiveData.readDword(); //掉落数量
|
||||
local nowdownnum = receiveData.readDword(); //当前计数
|
||||
local atk = receiveData.readDword(); //atk
|
||||
local BigSword = receiveData.readDword(); //是否满蓄力
|
||||
|
||||
local Xpos = receiveData.readDword();
|
||||
local Ypos = receiveData.readDword();
|
||||
|
||||
local size = 100;
|
||||
|
||||
local SwordIndex = sq_getRandom(1, 7);
|
||||
local ani;
|
||||
|
||||
if (nowdownnum > downnum) {
|
||||
ani = obj.getVar().GetAnimationMap("流星落蓄力一击", "passiveobject/sqr_po/swordman/animation/meteorsword/dropsword8_meteorsword_swords.ani");
|
||||
atk *= 5;
|
||||
size = 200;
|
||||
} else {
|
||||
ani = obj.getVar().GetAnimationMap("流星落", "passiveobject/sqr_po/swordman/animation/meteorsword/dropsword" + SwordIndex + "_meteorsword_swords.ani"); // 定义一下ani
|
||||
}
|
||||
obj.setCurrentAnimation(ani); //设置 特效 使用定义的 ani
|
||||
local attackInfo = sq_GetCustomAttackInfo(obj, 0); //设置 特效 使用6号位atk
|
||||
sq_SetCurrentAttackInfo(obj, attackInfo); //设置 当前攻击信息
|
||||
attackInfo = sq_GetCurrentAttackInfo(obj); //设置 attackInfo 为得到当前攻击信息
|
||||
|
||||
sq_SetCurrentAttackPower(attackInfo, atk); //给当前攻击设置 百分比
|
||||
|
||||
|
||||
local currentAni = sq_GetCurrentAnimation(obj); //得到特效当前正在播放ani
|
||||
local sizeRate = size.tofloat() / 100.0; //转换浮点数运算
|
||||
currentAni.setImageRateFromOriginal(sizeRate, sizeRate); //增加ani 宽度跟高度率
|
||||
currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); //增加ani als附加 ani大小比例
|
||||
sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); //攻击框,x y z比率
|
||||
|
||||
|
||||
obj.getVar("var").clear_vector();
|
||||
obj.getVar("var").push_vector(px); //掉落范围
|
||||
obj.getVar("var").push_vector(downnum); //掉落数量
|
||||
obj.getVar("var").push_vector(nowdownnum); //当前计数
|
||||
obj.getVar("var").push_vector(atk); //atk
|
||||
obj.getVar("var").push_vector(BigSword); //是否满蓄力
|
||||
|
||||
obj.getVar("var").push_vector(Xpos);
|
||||
obj.getVar("var").push_vector(Ypos);
|
||||
}
|
||||
|
||||
setCustomData_po_swordman_po_Table.rawset(235, setCustomData_po_Swordman_meteorsword);
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
function onKeyFrameFlag_po_swordman_meteorsword(obj, flagIndex) {
|
||||
local px = obj.getVar("var").get_vector(0); //掉落范围
|
||||
local downnum = obj.getVar("var").get_vector(1); //掉落数量
|
||||
local nowdownnum = obj.getVar("var").get_vector(2); //当前计数
|
||||
local atk = obj.getVar("var").get_vector(3); //atk
|
||||
local BigSword = obj.getVar("var").get_vector(4); //atk
|
||||
|
||||
local Xpos = obj.getVar("var").get_vector(5);
|
||||
local Ypos = obj.getVar("var").get_vector(6);
|
||||
if (flagIndex == 1) {
|
||||
|
||||
if (downnum > nowdownnum) //如果最大计数 大于当前计数
|
||||
{
|
||||
if (!obj.isMyControlObject()) return false; //如果不是我的控制对象则返回
|
||||
|
||||
local posX = Xpos + sq_getRandom(-px * 2, px * 2); //得到坐标
|
||||
local posY = Ypos + sq_getRandom(-px, px); //得到坐标
|
||||
|
||||
sq_BinaryStartWrite();
|
||||
sq_BinaryWriteDword(235);
|
||||
|
||||
sq_BinaryWriteDword(px); //atk 百分比值
|
||||
sq_BinaryWriteDword(downnum); //最大计数
|
||||
sq_BinaryWriteDword(nowdownnum + 1); //当前计数
|
||||
sq_BinaryWriteDword(atk); //
|
||||
sq_BinaryWriteDword(BigSword);
|
||||
|
||||
|
||||
sq_BinaryWriteDword(Xpos);
|
||||
sq_BinaryWriteDword(Ypos);
|
||||
|
||||
|
||||
sq_SendCreatePassiveObjectPacketPos(obj, 24370, 0, posX, posY, obj.getZPos()); //生成 obj特效
|
||||
sq_SetMyShake(obj, 1, 100);
|
||||
return true;
|
||||
}
|
||||
|
||||
} else if (flagIndex == 666) {
|
||||
sq_SetMyShake(obj, 5, 300);
|
||||
}
|
||||
if (flagIndex == 222 && BigSword == 1 && downnum == nowdownnum) {
|
||||
if (!obj.isMyControlObject()) return false; //如果不是我的控制对象则返回
|
||||
|
||||
local posX = Xpos; //得到坐标
|
||||
local posY = Ypos; //得到坐标
|
||||
|
||||
sq_BinaryStartWrite();
|
||||
sq_BinaryWriteDword(235);
|
||||
|
||||
sq_BinaryWriteDword(px); //atk 百分比值
|
||||
sq_BinaryWriteDword(downnum); //最大计数
|
||||
sq_BinaryWriteDword(nowdownnum + 1); //当前计数
|
||||
sq_BinaryWriteDword(atk); //
|
||||
sq_BinaryWriteDword(BigSword);
|
||||
|
||||
sq_BinaryWriteDword(Xpos);
|
||||
sq_BinaryWriteDword(Ypos);
|
||||
|
||||
sq_SendCreatePassiveObjectPacketPos(obj, 24370, 0, posX, posY, obj.getZPos()); //生成 obj特效
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
onKeyFrameFlag_po_swordman_po_Table.rawset(235, onKeyFrameFlag_po_swordman_meteorsword);
|
||||
}
|
||||
|
||||
{
|
||||
function onEndCurrentAni_po_swordman_meteorsword(obj) {
|
||||
sq_SendDestroyPacketPassiveObject(obj);
|
||||
}
|
||||
onEndCurrentAni_po_swordman_po_Table.rawset(235, onEndCurrentAni_po_swordman_meteorsword);
|
||||
}
|
||||
/*
|
||||
|
||||
|
||||
|
||||
function setCustomData_po_swordman_meteorsword(obj, receiveData)
|
||||
{
|
||||
local px = receiveData.readDword(); //掉落范围
|
||||
local downnum = receiveData.readDword(); //掉落数量
|
||||
local nowdownnum = receiveData.readDword(); //当前计数
|
||||
local atk = receiveData.readDword(); //atk
|
||||
|
||||
local Xpos = receiveData.readDword();
|
||||
local Ypos = receiveData.readDword();
|
||||
local WeaponIndex = receiveData.readDword();
|
||||
|
||||
local size = 100;
|
||||
|
||||
local SwordIndex = sq_getRandom(1, 7);
|
||||
local ani = obj.getVar().GetAnimationMap("流星落", "passiveobject/sqr_po/swordman/animation/meteorsword/dropsword" + SwordIndex + "_meteorsword_swords.ani"); // 定义一下ani
|
||||
if (WeaponIndex == 80000001)
|
||||
{
|
||||
ani = obj.getVar().GetAnimationMap("克拉丽丝流星落", "passiveobject/sqr_po/swordman/animation/meteorsword/dropsword8_meteorsword_swords.ani");
|
||||
downnum = downnum * 2;
|
||||
px = px + 2;
|
||||
}
|
||||
obj.setCurrentAnimation(ani); //设置 特效 使用定义的 ani
|
||||
local attackInfo = sq_GetCustomAttackInfo(obj, 6); //设置 特效 使用6号位atk
|
||||
sq_SetCurrentAttackInfo(obj, attackInfo); //设置 当前攻击信息
|
||||
attackInfo = sq_GetCurrentAttackInfo(obj); //设置 attackInfo 为得到当前攻击信息
|
||||
sq_SetCurrentAttackPower(attackInfo, atk); //给当前攻击设置 百分比
|
||||
|
||||
|
||||
local currentAni = sq_GetCurrentAnimation(obj); //得到特效当前正在播放ani
|
||||
local sizeRate = size.tofloat() / 100.0; //转换浮点数运算
|
||||
currentAni.setImageRateFromOriginal(sizeRate, sizeRate); //增加ani 宽度跟高度率
|
||||
currentAni.setAutoLayerWorkAnimationAddSizeRate(sizeRate); //增加ani als附加 ani大小比例
|
||||
sq_SetAttackBoundingBoxSizeRate(currentAni, sizeRate, sizeRate, sizeRate); //攻击框,x y z比率
|
||||
|
||||
|
||||
obj.getVar("var").clear_vector();
|
||||
obj.getVar("var").push_vector(px); //掉落范围
|
||||
obj.getVar("var").push_vector(downnum); //掉落数量
|
||||
obj.getVar("var").push_vector(nowdownnum); //当前计数
|
||||
obj.getVar("var").push_vector(atk); //atk
|
||||
|
||||
obj.getVar("var").push_vector(Xpos);
|
||||
obj.getVar("var").push_vector(Ypos);
|
||||
|
||||
}
|
||||
|
||||
function onKeyFrameFlag_po_swordman_meteorsword(obj, flagIndex)
|
||||
{
|
||||
if (flagIndex == 1)
|
||||
{
|
||||
local px = obj.getVar("var").get_vector(0); //掉落范围
|
||||
local downnum = obj.getVar("var").get_vector(1); //掉落数量
|
||||
local nowdownnum = obj.getVar("var").get_vector(2); //当前计数
|
||||
local atk = obj.getVar("var").get_vector(3); //atk
|
||||
|
||||
local Xpos = obj.getVar("var").get_vector(4);
|
||||
local Ypos = obj.getVar("var").get_vector(5);
|
||||
|
||||
|
||||
if (downnum > nowdownnum) //如果最大计数 大于当前计数
|
||||
{
|
||||
if (!obj.isMyControlObject()) return false; //如果不是我的控制对象则返回
|
||||
|
||||
local posX = Xpos + sq_getRandom(-px * 2, px * 2); //得到坐标
|
||||
local posY = Ypos + sq_getRandom(-px, px); //得到坐标
|
||||
|
||||
sq_BinaryStartWrite();
|
||||
sq_BinaryWriteDword(235);
|
||||
|
||||
sq_BinaryWriteDword(px); //atk 百分比值
|
||||
sq_BinaryWriteDword(downnum); //最大计数
|
||||
sq_BinaryWriteDword(nowdownnum + 1); //当前计数
|
||||
sq_BinaryWriteDword(atk); //
|
||||
|
||||
sq_BinaryWriteDword(Xpos);
|
||||
sq_BinaryWriteDword(Ypos);
|
||||
|
||||
|
||||
sq_SendCreatePassiveObjectPacketPos(obj, 24370, 0, posX, posY, obj.getZPos()); //生成 obj特效
|
||||
sq_SetMyShake(obj, 1, 100);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
78
character/Swordman/WeaponMaster/ap_Meteorsword.nut
Normal file
78
character/Swordman/WeaponMaster/ap_Meteorsword.nut
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
文件名:ap_Meteorsword.nut
|
||||
路径:character/Swordman/WeaponMaster/ap_Meteorsword.nut
|
||||
创建日期:2022-10-09 01:03
|
||||
文件用途:
|
||||
*/
|
||||
function sq_AddFunctionName(appendage) {
|
||||
appendage.sq_AddFunctionName("proc", "proc_appendage_meteorsword")
|
||||
appendage.sq_AddFunctionName("onStart", "onStart_appendage_meteorsword")
|
||||
}
|
||||
|
||||
function sq_AddEffect(appendage) {
|
||||
|
||||
}
|
||||
|
||||
function proc_appendage_meteorsword(appendage) {
|
||||
if (!appendage) return;
|
||||
|
||||
local parentObj = appendage.getParent(); //获得父对象
|
||||
local sourceObj = appendage.getSource(); //获得源对象
|
||||
|
||||
if (!sourceObj || !parentObj || sourceObj.getState() == STATE_STAND) {
|
||||
appendage.setValid(false);
|
||||
return;
|
||||
}
|
||||
|
||||
local startX = appendage.getVar().get_vector(0);
|
||||
local startY = appendage.getVar().get_vector(1);
|
||||
|
||||
sourceObj = sq_GetCNRDObjectToSQRCharacter(sourceObj); //将基础类对象转化为 角色对象
|
||||
|
||||
|
||||
if (sourceObj.getState() != 235) {
|
||||
appendage.setValid(false);
|
||||
return;
|
||||
}
|
||||
|
||||
local chrX = sq_GetDistancePos(sourceObj.getXPos(), sourceObj.getDirection(), 200);
|
||||
local chrY = sourceObj.getYPos();
|
||||
|
||||
local currT = appendage.getTimer().Get();
|
||||
|
||||
local maxT = 500;
|
||||
|
||||
|
||||
if (currT < maxT) {
|
||||
local currX = sq_GetUniformVelocity(startX, chrX, currT, maxT);
|
||||
local currY = sq_GetUniformVelocity(startY, chrY, currT, maxT);
|
||||
|
||||
parentObj.setCurrentPos(currX, currY, parentObj.getZPos());
|
||||
|
||||
} else {
|
||||
appendage.setValid(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function onStart_appendage_meteorsword(appendage) {
|
||||
if (!appendage) {
|
||||
return;
|
||||
}
|
||||
local parentObj = appendage.getParent();
|
||||
local sourceObj = appendage.getSource();
|
||||
|
||||
if (!sourceObj || !parentObj) {
|
||||
appendage.setValid(false);
|
||||
return;
|
||||
}
|
||||
appendage.getVar().clear_vector();
|
||||
appendage.getVar().push_vector(parentObj.getXPos());
|
||||
appendage.getVar().push_vector(parentObj.getYPos());
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user