574 lines
13 KiB
Plaintext
574 lines
13 KiB
Plaintext
|
||
SUB_STATE_MGRAB_0 <- 0
|
||
SUB_STATE_MGRAB_1 <- 1
|
||
|
||
function setStateMouseGrab(obj)
|
||
{
|
||
if (!obj) return;
|
||
|
||
local posX = obj.getXPos();
|
||
local posY = obj.getYPos();
|
||
local posZ = obj.getZPos();
|
||
//local grabNum = obj.sq_GetIntData(SKILL_MGRAB, 1); //1. 葆办蝶煎 濩击 热 毡朝 ?热
|
||
|
||
//obj.getVar("MouseGrab").clear_vector();
|
||
//obj.getVar("MouseGrab").push_vector(grabNum);
|
||
// 觼葬缣桧搅暧 蝶鉴樯策蝶蒂 撮??栖棻.
|
||
|
||
//setCreatorSkillStateSkillIndex(obj, SKILL_MGRAB);
|
||
//setCreatorSkillCount(obj, grabNum);
|
||
|
||
releaseOutLine(obj, "grabobj");
|
||
|
||
|
||
obj.getVar("mgrab").clear_vector();
|
||
obj.getVar("mgrab").push_vector(0);
|
||
obj.getVar("mgrab").push_vector(0);
|
||
|
||
obj.getVar("mgrab").clear_timer_vector();
|
||
obj.getVar("mgrab").push_timer_vector();
|
||
|
||
local t = obj.getVar("mgrab").get_timer_vector(0);
|
||
t.setParameter(100, -1);
|
||
t.resetInstant(0);
|
||
|
||
obj.getVar("mgrab").clear_ct_vector();
|
||
obj.getVar("mgrab").push_ct_vector();
|
||
local timer = obj.getVar("mgrab").get_ct_vector(0);
|
||
timer.Reset();
|
||
timer.Start(10000,0);
|
||
}
|
||
|
||
function grabThrowObject(obj)
|
||
{
|
||
local hoverEnemyObject = getOverClickableEnemyObject(obj, IMouse.GetXPos(), IMouse.GetYPos());
|
||
|
||
if (hoverEnemyObject)
|
||
{
|
||
local grabable = sq_IsGrabable(obj, hoverEnemyObject);
|
||
|
||
print(" grab:" + grabable + " holdable:" + sq_IsHoldable(obj, hoverEnemyObject));
|
||
if (sq_IsHoldable(obj, hoverEnemyObject) == true && sq_IsGrabable(obj, hoverEnemyObject) == true)
|
||
{ // 濩晦陛栋瞳桧塭贼 ?卫?栖棻.
|
||
|
||
// 濩擎匙桧 毡朝 唳办缣虏 啪桧虽蒂 还罹鄹栖棻.
|
||
local consumeValue = getCreatorSkillConsumeValue(obj, SKILL_MGRAB);
|
||
|
||
if (!useCreatorSkill(obj, SKILL_MGRAB, 0, 0, consumeValue))
|
||
return;
|
||
//
|
||
|
||
|
||
obj.getVar("grabobj").push_obj_vector(hoverEnemyObject); // grabobj
|
||
|
||
local activeobj = sq_GetCNRDObjectToActiveObject(hoverEnemyObject);
|
||
|
||
if (activeobj)
|
||
{
|
||
// ?葆葬虏 濩朝棻.
|
||
local objListSize = obj.getVar("grabobj").get_obj_vector_size();
|
||
|
||
print(" objListSize:" + objListSize);
|
||
|
||
for (local i =0;i<objListSize;++i)
|
||
{
|
||
local vObj = obj.getVar("grabobj").get_obj_vector(i);
|
||
|
||
local act = sq_GetCNRDObjectToActiveObject(vObj);
|
||
|
||
if (act == null)
|
||
continue;
|
||
|
||
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),0);
|
||
sq_AddSetStatePacketActiveObject(act,STATE_HOLD, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE);
|
||
}
|
||
}
|
||
} //if (sq_IsHoldable(obj, hoverEnemyObject) == false && sq_IsGrabable(obj, hoverEnemyObject) == true)
|
||
|
||
}
|
||
}
|
||
|
||
|
||
function onSetState_Mgrab(obj,state,datas,isResetTimer)
|
||
{
|
||
}
|
||
|
||
function onChangeSkillEffect_Mgrab(obj, skillIndex, reciveData)
|
||
{
|
||
if (!obj)
|
||
return;
|
||
|
||
local size = 8; // ?釭 涡 跷陛?捡?
|
||
local data_l =[];
|
||
|
||
data_l.resize(size);
|
||
|
||
for (local i = 0; i < 8; i++)
|
||
{
|
||
data_l[i] = -1;
|
||
|
||
if (reciveData.getSize() > 0)
|
||
{
|
||
data_l[i] = reciveData.readDword();
|
||
}
|
||
}
|
||
|
||
local targetObj = sq_GetObject(obj, data_l[0], data_l[1]);
|
||
|
||
if (targetObj)
|
||
{
|
||
local xPos = data_l[2];
|
||
local zPos = data_l[3];
|
||
|
||
if (zPos < 0)
|
||
zPos = 0;
|
||
|
||
local stateTimer = obj.sq_GetStateTimer();
|
||
|
||
if (!obj.getVar("mgrab").get_vector(0))
|
||
{
|
||
obj.getVar("mgrab").set_vector(0, xPos);
|
||
obj.getVar("mgrab").set_vector(1, zPos);
|
||
}
|
||
|
||
local state = data_l[4];
|
||
print(" on change state:" + state);
|
||
|
||
//if (obj.isMyControlObject())
|
||
{
|
||
if (state == 0)
|
||
{
|
||
if (targetObj.getState() != STATE_HOLD && targetObj.getState() != STATE_DOWN)
|
||
{
|
||
local act = sq_GetCNRDObjectToActiveObject(targetObj);
|
||
|
||
if (act)
|
||
{
|
||
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),0);
|
||
sq_AddSetStatePacketActiveObject(act, STATE_HOLD, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE);
|
||
print(" onchange setstate hold");
|
||
}
|
||
}
|
||
}
|
||
else if (state == 1)
|
||
{
|
||
local act = sq_GetCNRDObjectToActiveObject(targetObj);
|
||
|
||
if (act)
|
||
{
|
||
local direction = data_l[5];
|
||
local nX = data_l[6];
|
||
local nY = data_l[7];
|
||
|
||
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),direction);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),0);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),1);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),nX);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),nY);
|
||
sq_AddSetStatePacketActiveObject(act,STATE_DOWN, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE);
|
||
print(" onchange setstate down:");
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
sq_SetCurrentPos(targetObj, xPos, targetObj.getYPos(), zPos);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
function prepareDraw_Mgrab(obj)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
// 剪葬 桧? 颤啃击 琼嬴顶横 葬欐?朝 ?热殓栖棻.
|
||
function pushTargetDistanceMinObject(obj, targetObj, distance)
|
||
{
|
||
if (!obj)
|
||
return;
|
||
|
||
local objectManager = obj.getObjectManager();
|
||
|
||
if (objectManager == null)
|
||
return;
|
||
|
||
if (!targetObj)
|
||
return;
|
||
|
||
obj.getVar("mgrab").clear_obj_vector();
|
||
|
||
local grabObj = null;
|
||
for (local i = 0; i < objectManager.getCollisionObjectNumber(); i+=1)
|
||
{
|
||
local object = objectManager.getCollisionObject(i);
|
||
if (sq_IsHoldable(obj, object) == true && sq_IsGrabable(obj, object) == true)
|
||
{ // 濩晦陛栋瞳桧塭贼 ?卫?栖棻.
|
||
if (object && obj.isEnemy(object) && object.isInDamagableState(obj) && object.isObjectType(OBJECTTYPE_ACTIVE))
|
||
{
|
||
local isSame = isSameObject(targetObj, object);
|
||
if (isSame)
|
||
continue;
|
||
|
||
|
||
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
||
// 舱羲 顶缣怃 陛潍 陛梱遴 瞳击 坚艇棻
|
||
|
||
if (activeObj)
|
||
{
|
||
if (!activeObj.isDead())
|
||
{
|
||
local dis = sq_GetDistanceObject(targetObj, object, false);
|
||
|
||
if (dis < distance)
|
||
{
|
||
distance = dis;
|
||
grabObj = activeObj;
|
||
//obj.getVar("mgrab").push_obj_vector(object);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} //if (sq_IsHoldable(obj, hoverEnemyObject) == false && sq_IsGrabable(obj, hoverEnemyObject) == true)
|
||
}
|
||
|
||
if (grabObj)
|
||
{
|
||
obj.getVar("mgrab").push_obj_vector(grabObj);
|
||
}
|
||
}
|
||
|
||
|
||
function onProc_Mgrab(obj)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
if (!obj.isMyControlObject())
|
||
return;
|
||
|
||
local objListSize = obj.getVar("grabobj").get_obj_vector_size();
|
||
|
||
if (objListSize <= 0)
|
||
return;
|
||
|
||
local stage = sq_GetObjectManagerStage(obj);
|
||
|
||
if (!stage)
|
||
return;
|
||
|
||
local control = stage.getMainControl();
|
||
|
||
if (control.IsRBDown())
|
||
{
|
||
onMouseMoveButtonDown_Mgrab(obj);
|
||
}
|
||
else
|
||
{
|
||
onMouseButtonUp_Mgrab(obj);
|
||
}
|
||
}
|
||
|
||
// 葆办蝶 帼?击 机卫俪击 阳 籀葬?捡肾朝 睡碟殓栖棻.
|
||
function onMouseButtonUp_Mgrab(obj)
|
||
{
|
||
local objListSize = obj.getVar("grabobj").get_obj_vector_size();
|
||
|
||
print(" onMouseButtonUp_Mgrab:" + objListSize);
|
||
for (local i = 0; i < objListSize;++i)
|
||
{
|
||
|
||
local hoverEnemy = obj.getVar("grabobj").get_obj_vector(i);
|
||
if (hoverEnemy)
|
||
{
|
||
local activeobj = sq_GetCNRDObjectToActiveObject(hoverEnemy);
|
||
if (activeobj)
|
||
{
|
||
local srcX = obj.getVar("mgrab").get_vector(0);
|
||
local srcY = sq_GetYPos(activeobj);
|
||
local srcZ = obj.getVar("mgrab").get_vector(1);
|
||
|
||
if (srcZ < 0)
|
||
srcZ = 0;
|
||
|
||
local dstX = sq_GetXPos(activeobj);
|
||
local dstY = sq_GetYPos(activeobj);
|
||
local dstZ = sq_GetZPos(activeobj);
|
||
|
||
if (dstZ < 0)
|
||
dstZ = 0;
|
||
|
||
print(" sx:" + srcX + " sy:" + srcY + " sz:" + srcZ);
|
||
print(" dx:" + dstX + " dy:" + dstY + " dz:" + dstZ);
|
||
|
||
local distance = sq_GetDistance( srcX, srcZ, dstX, dstZ, true);
|
||
|
||
local width = sq_Abs(dstX - srcX);
|
||
local h = sq_Abs((dstZ) - (srcZ));
|
||
|
||
print(" h:" + h);
|
||
|
||
if (h <= 0)
|
||
h = 10;
|
||
|
||
local angle = sq_Atan2( h.tofloat(), width.tofloat());
|
||
|
||
local nRevision = distance;
|
||
|
||
local cos = nRevision.tofloat() * sq_Cos(angle);
|
||
local sin = nRevision.tofloat() * sq_Sin(angle);
|
||
|
||
local nX = sq_Abs( cos.tointeger() ) * 2;
|
||
local nY = sq_Abs( sin.tointeger() ) * 2;
|
||
|
||
|
||
local direction = sq_GetDirection(activeobj);
|
||
|
||
if ((dstX - srcX) < 0)
|
||
{
|
||
nX = -nX;
|
||
}
|
||
|
||
|
||
direction = 0;
|
||
print(" nX:" + nX + " nY:" + nY + " offset:" + (dstX - srcX) + " direction:" + direction + " activeobj:" + activeobj);
|
||
sq_IntVectorClear(sq_GetGlobalIntVector());
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),direction);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),0);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),1);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),nX);
|
||
sq_IntVectorPush(sq_GetGlobalIntVector(),nY);
|
||
sq_AddSetStatePacketActiveObject(activeobj,STATE_DOWN, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE);
|
||
print(" activeobj:" + activeobj + " setstate down:");
|
||
|
||
|
||
local group = sq_GetGroup(activeobj);
|
||
local uniqueId = sq_GetUniqueId(activeobj);
|
||
|
||
sq_BinaryStartWrite();
|
||
|
||
sq_BinaryWriteDword(group); // 0
|
||
sq_BinaryWriteDword(uniqueId); // 1
|
||
sq_BinaryWriteDword(dstX); // 2
|
||
sq_BinaryWriteDword(dstZ); // 3
|
||
// 1廓擎 state_down鼻鹧殓栖棻.
|
||
sq_BinaryWriteDword(1); // 4
|
||
sq_BinaryWriteDword(direction); // 5
|
||
sq_BinaryWriteDword(nX); // 6
|
||
sq_BinaryWriteDword(nY); // 7
|
||
sq_SendChangeSkillEffectPacket(obj, SKILL_MGRAB);
|
||
print(" sq_SendChangeSkillEffectPacket down");
|
||
}
|
||
}
|
||
}
|
||
|
||
obj.getVar("mgrab").clear_vector();
|
||
obj.getVar("mgrab").push_vector(0);
|
||
obj.getVar("mgrab").push_vector(0);
|
||
|
||
releaseOutLine(obj, "grabobj");
|
||
|
||
if (objListSize)
|
||
{
|
||
obj.sq_PlaySound("R_THROW_MONSTER");
|
||
}
|
||
}
|
||
|
||
// 葆办蝶 帼?击 棻遴卫俪击 阳 籀葬?捡肾朝 睡碟殓栖棻.
|
||
function onMouseMoveCharacter_Mgrab(obj)
|
||
{
|
||
onMouseMoveButtonDown_Mgrab(obj);
|
||
}
|
||
|
||
|
||
function onMouseMoveButtonDown_Mgrab(obj)
|
||
{
|
||
local hoverEnemy = obj.getVar("grabobj").get_obj_vector(0);
|
||
|
||
if (!hoverEnemy)
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
local objectManager = obj.getObjectManager();
|
||
|
||
local objListSize = obj.getVar("grabobj").get_obj_vector_size();
|
||
|
||
local t = obj.getVar("mgrab").get_ct_vector(0);
|
||
local time = 0;
|
||
|
||
if(t)
|
||
time = t.Get();
|
||
|
||
local skill_level = obj.sq_GetSkillLevel(SKILL_MGRAB);
|
||
|
||
|
||
local activeObj = sq_GetCNRDObjectToActiveObject(hoverEnemy);
|
||
|
||
if (!activeObj)
|
||
{
|
||
onMouseButtonUp_Mgrab(obj);
|
||
return;
|
||
}
|
||
|
||
// 跪 颤殓涤煎 濩坚毡朝 譆渠卫除桧 殖塭喂栖棻.
|
||
// 0. 橾奁跪 濩坚 毡击阳 譆渠卫除
|
||
// 1. 啻歜萄 濩坚 毡击阳 譆渠卫除
|
||
// 2. 尔蝶跪 濩坚 毡击阳 譆渠卫除
|
||
// 3. ?跨蝶搅 濩坚 毡击阳 譆渠卫除
|
||
// 4. apc 濩坚 毡击阳 譆渠卫除
|
||
|
||
// 橾奁橾隆 蚝岁0
|
||
local columnIndex = SKL_LV_0;
|
||
if (sq_IsNamed(activeObj))
|
||
{
|
||
// 啻歜萄 橾隆 蚝岁1
|
||
columnIndex = SKL_LV_1;
|
||
}
|
||
else if (sq_IsBoss(activeObj))
|
||
{
|
||
// 尔蝶 橾隆 蚝岁2
|
||
columnIndex = SKL_LV_2;
|
||
}
|
||
else if (sq_IsHellMonster(activeObj))
|
||
{
|
||
// ?跨蝶搅 橾隆 蚝岁3
|
||
columnIndex = SKL_LV_3;
|
||
}
|
||
else if (sq_IsAiCharacter(activeObj))
|
||
{
|
||
// apc橾隆
|
||
columnIndex = SKL_LV_4;
|
||
}
|
||
|
||
// 濩坚毡击 热 毡朝 譆渠卫除
|
||
local maxTime = obj.sq_GetLevelData(SKILL_MGRAB, columnIndex, skill_level);
|
||
|
||
print(" maxTime:" + maxTime + " time:" + time);
|
||
|
||
if (time > maxTime)
|
||
{
|
||
onMouseButtonUp_Mgrab(obj);
|
||
}
|
||
else
|
||
{
|
||
for (local i =0;i<objListSize;++i)
|
||
{
|
||
local vObj = obj.getVar("grabobj").get_obj_vector(i);
|
||
|
||
if (!vObj)
|
||
continue;
|
||
|
||
local xPos = objectManager.getFieldXPos(IMouse.GetXPos(), ENUM_DRAWLAYER_NORMAL);
|
||
local zPos = objectManager.getFieldZPos(IMouse.GetYPos(), vObj.getYPos(), ENUM_DRAWLAYER_NORMAL) - (sq_GetObjectHeight(hoverEnemy) / 2);
|
||
|
||
local group = sq_GetGroup(vObj);
|
||
local uniqueId = sq_GetUniqueId(vObj);
|
||
|
||
sq_BinaryStartWrite();
|
||
|
||
sq_BinaryWriteDword(group); //
|
||
sq_BinaryWriteDword(uniqueId); //
|
||
sq_BinaryWriteDword(xPos);
|
||
sq_BinaryWriteDword(zPos);
|
||
// 0廓擎 state_hold鼻鹧殓栖棻.
|
||
sq_BinaryWriteDword(0);
|
||
sq_BinaryWriteDword(0);
|
||
sq_BinaryWriteDword(0);
|
||
sq_BinaryWriteDword(0);
|
||
sq_SendChangeSkillEffectPacket(obj, SKILL_MGRAB);
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
function onProcCon_Mgrab(obj)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onEndCurrentAni_Mgrab(obj)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onKeyFrameFlag_Mgrab(obj,flagIndex)
|
||
{
|
||
|
||
if (!obj) return false;
|
||
|
||
return true;
|
||
|
||
}
|
||
|
||
function onEndState_Mgrab(obj,new_state)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onAfterSetState_Mgrab(obj,state,datas,isResetTimer)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onBeforeAttack_Mgrab(obj,damager,boundingBox,isStuck)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onAttack_Mgrab(obj,damager,boundingBox,isStuck)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onAfterAttack_Mgrab(obj,damager,boundingBox,isStuck)
|
||
{
|
||
|
||
if (!obj) return 0;
|
||
|
||
return 1;
|
||
|
||
}
|
||
|
||
function onBeforeDamage_Mgrab(obj,attacker,boundingBox,isStuck)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onDamage_Mgrab(obj,attacker,boundingBox)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|
||
function onAfterDamage_Mgrab(obj,attacker,boundingBox)
|
||
{
|
||
|
||
if (!obj) return;
|
||
|
||
}
|
||
|