Sqr/character/creatormage/mgrab/mgrab.nut

574 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}