Sqr/Plugins/Roters/Roters.nut

624 lines
24 KiB
Plaintext

/*
文件名:Roters.nut
路径:Plugins/Roters/Roters.nut
创建日期:2022-11-02 12:27
文件用途:罗特斯世界BOSS
*/
RotersControl <- null
RotersRankControl <- null
RotersDgnIndex <- 18081
RotersMapIndex <- 48502
RotersMonIndex <- 8865646
SpiritBarrierNum <- 9
SpiritBarrierHit_MaxNum <- 100
SpiritBarrierHit_Damage <- 0.01
class RotersHudButton extends BasicsDrawTool {
obj = null;
buttonName = null;
x = null;
y = null;
yoffset = 0;
BaseAnifile = null;
width = null;
length = null;
constructor(gObj, gButtonName, gX, gY, gAnifile, gWidth, gLength) {
obj = gObj;
buttonName = gButtonName;
x = gX;
y = gY;
BaseAnifile = gAnifile;
width = gWidth;
length = gLength;
}
function DrawButton() {
if (isDown() && yoffset == 0) {
yoffset = 1;
y++;
}
T_DrawStayAni(obj, BaseAnifile, x, y, 0, buttonName);
if (isInRect()) {
T_DrawStayAni(obj, BaseAnifile, x, y, 1, buttonName);
}
}
function isInRect() {
local mouseX = IMouse.GetXPos();
local mouseY = IMouse.GetYPos();
if (sq_IsIntersectRect(mouseX, mouseY, 5, 5, x, y, width, length))
return true;
return false;
}
function isDown() {
if (isInRect() && IMouse.IsLBDown()) {
obj.getVar(buttonName).setBool(0, true);
return true;
}
return false;
}
function isActive() {
if (isInRect() && IMouse.IsLBUp() && obj.getVar(buttonName).getBool(0)) {
obj.getVar(buttonName).setBool(0, false);
yoffset = 0;
return true;
}
return false;
}
}
class Roters_Control extends BasicsDrawTool {
//类状态
STATE = 0;
Monster_obj = null;
Time_obj = null;
ID_Object = null; //怪物的ID
GR_Object = null; //怪物组
AP_Chr = null; //人物的AP
Boss_StaticHp = null;
Boss_LastHp = 1.0;
Boss_RealHp = null;
EndBoss_HP = null;
SpiritBarrier = SpiritBarrierNum;
Hit_Num = 0;
Hit_MaxNum = SpiritBarrierHit_MaxNum;
Rem_Time = null;
BossHpMainAni = null;
BossHpAni = null;
BossHpRdcT_obj = null;
BossHpEffT_obj = null;
BackTown = null;
GoTownTime = null;
//构造函数
constructor() {
//构造时间容器
Time_obj = TimeSTL("RotersDgn", 160000);
}
function exit() {
STATE = -1;
Time_obj.Reset();
Time_obj.Delete();
}
function GetWorldIndex() {
local stage = sq_GetGlobaludpModuleStage();
local MapIndex = sq_GetMapIndex(stage);
return MapIndex;
}
//初始化Boss基础代码
function InitBossStatic(obj) {
//类状态为0时
if (STATE == 0) {
//还没有给怪物附加AP时
if (ID_Object == null) {
local objectManager = obj.getObjectManager();
if (!objectManager) return;
local CollisionObjectNumber = objectManager.getCollisionObjectNumber();
for (local i = 0; i < CollisionObjectNumber; ++i) {
local Monobject = objectManager.getCollisionObject(i);
local MonIndex = Monobject.getCollisionObjectIndex();
//罗特斯 附加以后类状态写入1
if (MonIndex == RotersMonIndex) {
Monobject.setObjectHeight(6666);
sq_ChangeDrawLayer(Monobject, ENUM_DRAWLAYER_BOTTOM);
//Ap_Object = CNSquirrelAppendage.sq_AppendAppendage(Monobject, obj, -1, false, "appendage/roters/ap_roters.nut", true);
ID_Object = sq_GetUniqueId(Monobject);
GR_Object = sq_GetGroup(Monobject);
Time_obj.Start();
STATE = 1;
}
//门
if (MonIndex == 5718) {
sq_ChangeDrawLayer(Monobject, 7);
}
}
}
}
}
//初始化人物基础代码
function InitChrStatic(obj) {
//如果类状态为1时
if (STATE == 1) {
//如果人物AP不存在时
if (AP_Chr == null) {
//附加人物AP 并将类状态写入2
AP_Chr = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "appendage/roters/ap_chr.nut", true);
STATE = 2;
}
}
}
//罗特斯Ap proc 执行代码
function proc_Roters_M(obj) {
if (!ID_Object || !GR_Object) return;
local sourceObj = sq_GetObject(obj, GR_Object, ID_Object); //得到源对象 -- 施加AP的人
sourceObj = sq_GetCNRDObjectToActiveObject(sourceObj);
//如果附加Ap的人不存在了直接返回城镇
if (sourceObj.isDead()) {
L_sq_GoTown();
return;
}
//如果Ap源对象不是我 则直接返回 只需要一个人来操作机制
if (!sourceObj.isMyControlObject()) return;
//如果Boss的基准生命值为空时 赋值给Boss最大生命值
if (Boss_StaticHp == null) Boss_StaticHp = sourceObj.getHpMax();
//如果Boss对象为空时 赋值给对象
//if (Monster_obj == null) Monster_obj = sourceObj;
//Boss当前真实生命值赋值
Boss_RealHp = sourceObj.getHp();
//判断时间写入Boss蓝耗机制
if (Rem_Time > 12000 && Rem_Time < 15000) {
sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.9) - 15.0).tointeger());
if (STATE == 2) STATE = 3;
}
if (Rem_Time > 8000 && Rem_Time < 12000) {
sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.7) - 15.0).tointeger());
if (STATE == 3) STATE = 4;
}
if (Rem_Time > 0 && Rem_Time < 8000) {
sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.5) - 15.0).tointeger());
if (STATE == 4) STATE = 5;
}
}
//人物AP执行代码
function onAttack_chr_M(appendage, realAttacker, damager, boundingBox, isStuck) {
local ParentObj = appendage.getParent(); //得到源对象 -- 施加AP的人
if (!ID_Object || !GR_Object) return;
local sourceObj = sq_GetObject(ParentObj, GR_Object, ID_Object); //得到源对象 -- 施加AP的人
sourceObj = sq_GetCNRDObjectToActiveObject(sourceObj);
//如果Ap父对象不是我 则直接返回 不增加其他人的连击数
if (!ParentObj.isMyControlObject()) return;
//如果攻击到的是罗特斯本体不增加连击数
if (damager.getCollisionObjectIndex() == RotersMonIndex) return;
//如果连击数小于100 每次攻击+1
if (Hit_Num < 100) ++Hit_Num;
//如果连击数大于等于100 并且壁障数大于0
if (Hit_Num >= 100 && SpiritBarrier > 0) {
//清空连击数 壁障数设置-1
Hit_Num = 0;
--SpiritBarrier;
sourceObj.setHp(sourceObj.getHp() - (sourceObj.getHpMax().tofloat() * SpiritBarrierHit_Damage).tointeger(), null, true);
CallBossHp(1);
}
}
//绘制精神屏障主界面
function drawSpiritBarrier(obj) {
T_DrawStayAni(obj, "common/dungeon/roters/bz/main.ani", 650, 25, 0, "精神屏障主界面");
setClip(659, 50, 659 + (97 * (Hit_Num.tofloat() / Hit_MaxNum.tofloat())).tointeger(), 54);
T_DrawStayAni(obj, "common/dungeon/roters/bz/main.ani", 659, 50, 1, "精神屏障进度条");
releaseClip();
T_DrawCustomNum(obj, 736, 26, SpiritBarrier, "common/dungeon/roters/bz/", 0);
}
//绘制时间
function drawTime(obj) {
if (!Time_obj.Get()) return;
Rem_Time = (160000 - Time_obj.Get()) / 10;
local Offset_Xpos = 0;
if (Rem_Time < 10000) Offset_Xpos = -9;
if (Rem_Time < 1000) Offset_Xpos = -18;
if (IMouse.GetXPos() < 205 && IMouse.GetYPos() < 49 && IMouse.GetXPos() >= 0 && IMouse.GetYPos() >= 0) T_DrawStayAni(obj, "common/dungeon/roters/time/main.ani", 0, 2, 1, "倒计时主界面背景");
T_DrawStayAni(obj, "common/dungeon/roters/time/main.ani", 0, 2, 0, "倒计时主界面");
T_DrawStayAni(obj, "common/dungeon/roters/time/d.ani", 101 + Offset_Xpos, 9, 0, "时间点");
T_DrawStayAni(obj, "common/dungeon/roters/time/d.ani", 101 + Offset_Xpos, 18, 0, "时间点2");
T_DrawCustomTimeNum(obj, 132 + Offset_Xpos, 23, Rem_Time, "common/dungeon/roters/time/", 18, 0);
}
//绘制Boss血条动画
function drawBossHp(obj) {
if (BossHpRdcT_obj) {
local nowhun = Boss_RealHp.tofloat() / Boss_StaticHp.tofloat();
BossHpMainAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 106, 67, 0, "Boss血条主界面");
local v = sq_GetUniformVelocity((Boss_LastHp * 493.0).tointeger(), (nowhun * 493.0).tointeger(), BossHpRdcT_obj.Get(), 1000);
setClip(154, 88, 154 + v, 109);
BossHpAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 154, 88, 1, "Boss血条");
releaseClip();
BossHpMainAni.setRGBA(255, 255, 255, 250);
BossHpAni.setRGBA(255, 255, 255, 250);
if (BossHpRdcT_obj.Get() >= 2000) {
BossHpRdcT_obj.Delete();
BossHpRdcT_obj = null;
CallBossHp(2);
}
} else if (BossHpEffT_obj) {
local nowhun = Boss_RealHp.tofloat() / Boss_StaticHp.tofloat();
BossHpMainAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 106, 67, 0, "Boss血条主界面");
setClip(154, 88, 154 + (nowhun * 493.0).tointeger(), 109);
BossHpAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 154, 88, 1, "Boss血条");
releaseClip();
local v = sq_GetUniformVelocity(250, 0, BossHpEffT_obj.Get(), 1000);
BossHpMainAni.setRGBA(255, 255, 255, v);
BossHpAni.setRGBA(255, 255, 255, v);
if (BossHpEffT_obj.Get() >= 1000) {
BossHpEffT_obj.Delete();
BossHpEffT_obj = null;
Boss_LastHp = nowhun;
}
}
}
//绘制Boss血条动画
function CallBossHp(Type) {
switch (Type) {
case 1:
if (BossHpRdcT_obj == null) BossHpRdcT_obj = TimeSTL("RotersBossHpRdc", 2000);
BossHpRdcT_obj.Reset();
BossHpRdcT_obj.Start();
break;
case 2:
if (BossHpEffT_obj == null) BossHpEffT_obj = TimeSTL("RotersBossHpEff", 1000);
BossHpEffT_obj.Reset();
BossHpEffT_obj.Start();
break;
}
}
function DrawMain(obj) {
if (STATE >= 6) return;
//绘制精神屏障主界面
drawSpiritBarrier(obj);
//绘制时间
drawTime(obj);
drawBossHp(obj);
}
function ProcDgn(obj) {
//初始化BOSS基础代码
InitBossStatic(obj);
//初始化角色基础代码
InitChrStatic(obj);
//罗特斯循环函数
proc_Roters_M(obj);
//如果时间结束
if (Rem_Time == 0 && STATE >= 3) {
if (EndBoss_HP == null) EndBoss_HP = Boss_StaticHp - Boss_RealHp;
if (BackTown == null) BackTown = RotersHudButton(obj, "rotersbacktown", 371, 245, "common/dungeon/roters/damage/back.ani", 66, 19);
local Offset_Xpos = ((EndBoss_HP.tostring().len() - 1) * -5);
T_DrawStayAni(obj, "common/dungeon/roters/damage/main.ani", 249, 115, 0, "结算主界面");
T_DrawCustomNum(obj, 395 + Offset_Xpos, 171, EndBoss_HP, "common/dungeon/roters/damage/num/", 10);
if (STATE == 5) {
local WorldBossUpdateDamage = Json_STL("WorldBossUpdateDamage");
WorldBossUpdateDamage.Put("op", 13);
WorldBossUpdateDamage.Put("hurt", EndBoss_HP);
local str = WorldBossUpdateDamage.GetString();
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
WorldBossUpdateDamage.Delete();
STATE = 6;
}
BackTown.DrawButton();
if (BackTown.isActive()) {
L_sq_GoTown();
}
}
}
}
function Roters(obj) {
//如果在副本中
if (sq_GetCurrentModuleType() == 3) {
//如果获取当前地图ID 等于 罗特斯地图ID
if (Roters_Control.GetWorldIndex() == RotersMapIndex) {
//如果罗特斯对象为空 则实例化
if (RotersControl == null) {
RotersControl = Roters_Control();
}
//执行逻辑主函数
RotersControl.ProcDgn(obj);
//执行绘制主函数
RotersControl.DrawMain(obj);
} else {
//如果罗特斯对象不为空 则销毁他
if (RotersControl != null) {
RotersControl.exit();
RotersControl = null;
}
}
} else {
//如果罗特斯对象不为空 则销毁他
if (RotersControl != null) {
RotersControl.exit();
RotersControl = null;
}
}
}
//罗特斯排行榜界面类
class Roters_RankControl extends BasicsDrawTool {
State = -2; //世界BOSS当前状态
End = 0;
Windows_Object = null;
AnimotionState = 0;
BufferTimeSTL = null;
Page = 0;
MainSwitchButton = null;
//OP模式
ThisOp = null;
//类JsonBuffer
ThisJsonBuffer = null;
function RotersRankCallBack(chunk) {
local RootTab = getroottable();
if (RootTab.rawin("ROTERSRANKCONTROL") == false) return;
local RotersRankPack = Json_STL("RotersRankPack");
RotersRankPack.Parse(chunk, 0, false);
local op = RotersRankPack.Get("op");
switch (op) {
//开界面
case 12: {
RootTab["ROTERSRANKCONTROL"].ThisOp = 12;
if (RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer) RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer.Delete();
RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer = Json_STL("ThisJsonBuffer");
RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer.Parse(chunk, 0, false);
}
break;
//开启世界BOSS
case 14:
RootTab["ROTERSRANKCONTROL"].ThisOp = 14;
break;
//打赢了
case 16:
RootTab["ROTERSRANKCONTROL"].ThisOp = 16;
break;
//没打赢
case 18:
RootTab["ROTERSRANKCONTROL"].ThisOp = 18;
break;
//彻底结束
case 20:
RootTab["ROTERSRANKCONTROL"].ThisOp = 20;
break;
default:
break;
}
RotersRankPack.Delete();
}
constructor() {
Pack_Control.rawset(12, RotersRankCallBack);
Pack_Control.rawset(14, RotersRankCallBack);
Pack_Control.rawset(16, RotersRankCallBack);
Pack_Control.rawset(18, RotersRankCallBack);
Pack_Control.rawset(20, RotersRankCallBack);
BufferTimeSTL = TimeSTL("RotersBufferTimeSTL", 3000);
}
//绘制排名信息
function DrawRankInfo(obj) {
//如果信息表不存在 或数据不正确 则返回
if (!ThisJsonBuffer || ThisJsonBuffer.tostring().len() < 1) return;
local Y_Pos_Offset = 0;
for (local i = 0; i < 11; i++) {
if (i == 10) Y_Pos_Offset = 3;
L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->rank"), 163, 325 + (i * 16) + Y_Pos_Offset, 0xFF99D7FF, 1);
L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->cName"), 257, 325 + (i * 16) + Y_Pos_Offset, 0xFF00D7FF, 1);
L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->job"), 409, 325 + (i * 16) + Y_Pos_Offset, 0xB79260FF, 1);
L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->hurt"), 535, 325 + (i * 16) + Y_Pos_Offset, 0xFFFF00FF, 1);
}
}
//绘制主界面框
function DrawRankMain(obj) {
//如果信息表不存在 或数据不正确 则返回
if (!ThisJsonBuffer || ThisJsonBuffer.tostring().len() < 1) return;
T_DrawStayAni(obj, "common/dungeon/roters/main/main.ani", 129, 8, 0, "罗特斯Rank主界面");
//T_DrawDynamicAni(obj, "common/dungeon/roters/main/maineff.ani", 133, 52, "罗特斯Rankeff主界面");
local HpPoi = ThisJsonBuffer.Get("hppercentage").tofloat() / 100.0;
setClip(130, 28, 130 + (542.0 * HpPoi).tointeger(), 68);
T_DrawStayAni(obj, "common/dungeon/roters/main/mainhp.ani", 130, 28, 0, "罗特斯Rank生命值");
releaseClip();
local AttackButton = ButtonPro(obj, "AttackButton", 542, 270, "common/dungeon/roters/main/attackbutton.ani", 120, 20);
AttackButton.SetRectEnble(true, "AttackButton", 542, 270, "common/dungeon/roters/main/attackbutton.ani", 1);
AttackButton.SetCustomClickEnble(true, "AttackButton", 542, 270 + 1, "common/dungeon/roters/main/attackbutton.ani", 1);
if (End != 1) AttackButton.Show();
if (AttackButton.isLBActive()) {
L_sq_GoDungeon(RotersDgnIndex);
}
local RightSwitchButton = ButtonPro(obj, "RightSwitchButton", 460, 504, "common/dungeon/roters/main/rightbutton.ani", 11, 13);
RightSwitchButton.SetRectEnble(true, "RightSwitchButton", 460, 504, "common/dungeon/roters/main/rightbutton.ani", 1);
RightSwitchButton.SetCustomClickEnble(true, "RightSwitchButton", 460, 504 + 1, "common/dungeon/roters/main/rightbutton.ani", 1);
RightSwitchButton.Show();
if (RightSwitchButton.isLBActive()) {
if (Page < 4) ++Page;
local Test = Json_STL("WorldBossBuffer");
Test.Put("op", 11);
Test.Put("page", Page);
local str = Test.GetString();
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
Test.Delete();
}
local LeftSwitchButton = ButtonPro(obj, "LeftSwitchButton", 336, 504, "common/dungeon/roters/main/leftbutton.ani", 11, 13);
LeftSwitchButton.SetRectEnble(true, "LeftSwitchButton", 336, 504, "common/dungeon/roters/main/leftbutton.ani", 1);
LeftSwitchButton.SetCustomClickEnble(true, "LeftSwitchButton", 336, 504 + 1, "common/dungeon/roters/main/leftbutton.ani", 1);
LeftSwitchButton.Show();
if (LeftSwitchButton.isLBActive()) {
if (Page > 0) --Page;
local Test = Json_STL("WorldBossBuffer");
Test.Put("op", 11);
Test.Put("page", Page);
local str = Test.GetString();
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
Test.Delete();
}
}
//绘制主界面开启按钮
function DrawMainButton(obj) {
T_DrawDynamicAni(obj, "common/dungeon/roters/main/mainbuttoneff.ani", -30, 35, "罗特斯Rank按钮特效");
if (MainSwitchButton == null) {
MainSwitchButton = ButtonPro(obj, "MainSwitchButton", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 65, 65);
}
MainSwitchButton.SetRectEnble(true, "MainSwitchButtonr", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 1);
MainSwitchButton.SetCustomClickEnble(true, "MainSwitchButtonc", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 2);
MainSwitchButton.Show();
if (MainSwitchButton.isLBActive()) {
if (!sq_GetPopupWindowMainCotrol(267)) L_NewWindows("Lenheart", 267, 0x65535);
local Test = Json_STL("WorldBossBuffer");
Test.Put("op", 11);
Test.Put("page", Page);
local str = Test.GetString();
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
Test.Delete();
}
}
//Run主执行函数
function Run(obj) {
//初始状态
if (State == -2) {
//构造 嗅探包 请求世界Boss是否开启
local WordBossSwitchReqPack = Json_STL("WordBossSwitchReqPack");
WordBossSwitchReqPack.Put("op", 15);
local StrBuffer = WordBossSwitchReqPack.GetString();
L_sq_SendPackType(130);
L_sq_SendPackWChar(StrBuffer);
L_sq_SendPack();
WordBossSwitchReqPack.Delete();
State = -1;
}
//等待开启信号状态
if (State == -1) {
//如果OP状态等于14
if (ThisOp == 14) {
if (AnimotionState == 0) {
BufferTimeSTL.Reset();
BufferTimeSTL.Start();
AnimotionState = 1;
}
if (AnimotionState == 1) {
local MainStartAni = T_DrawStayAni(obj, "common/dungeon/roters/main/mainstart.ani", 80, 50, 0, "RotersMainStartAni");
local v = sq_GetUniformVelocity(0, 250, BufferTimeSTL.Get(), 3000);
MainStartAni.setRGBA(255, 255, 255, v);
if (BufferTimeSTL.Get() >= 2900) {
BufferTimeSTL.Reset();
BufferTimeSTL.Start();
AnimotionState = 2;
}
}
if (AnimotionState == 2) {
local MainStartAni = T_DrawStayAni(obj, "common/dungeon/roters/main/mainstart.ani", 80, 50, 0, "RotersMainStartAni");
local v = sq_GetUniformVelocity(250, 0, BufferTimeSTL.Get(), 3000);
MainStartAni.setRGBA(255, 255, 255, v);
if (BufferTimeSTL.Get() >= 2900) {
BufferTimeSTL.Reset();
BufferTimeSTL.Delete();
BufferTimeSTL = null;
AnimotionState = 3;
}
}
if (AnimotionState == 3) {
End = 0; //是否结束写入0
State = 0;
}
}
}
//绘制世界BOSS面板按钮
if (State == 0) {
DrawMainButton(obj);
//如果收到 op 12号包 打开了面板 state写入1
if (ThisOp == 12) {
State = 1;
ThisOp = 0;
}
}
//绘制面板
if (State == 1) {
//如果窗口开启绘制面板 绘制排名
if (sq_GetPopupWindowMainCotrol(267)) {
Windows_Object = sq_GetPopupWindowMainCotrol(267);
DrawRankMain(obj);
DrawRankInfo(obj);
}
//窗口关闭状态写回0
else {
State = 0;
}
}
//检测到 打赢或者打输了的 包 是否结束写入1
if (ThisOp == 16 || ThisOp == 18) {
State = 0;
End = 1;
}
//世界BOSS彻底结束 状态回归-2
if (ThisOp == 20) {
State = -2;
}
}
}
function RotersRank(obj) {
//只在城镇中执行
if (sq_GetCurrentModuleType() != 1) return;
local RootTab = getroottable();
//如果不在西海岸主干道不执行
if (L_sq_GetTownIndex() != 3 || L_sq_GetRegionIndex() != 0) {
if (RootTab.rawin("ROTERSRANKCONTROL"))RootTab.rawdelete("ROTERSRANKCONTROL");
return;
}
//如果对象不存在 实例化对象
if (RootTab.rawin("ROTERSRANKCONTROL") == false) {
local ROTERSRANKCONTROLOBJ = Roters_RankControl();
RootTab.rawset("ROTERSRANKCONTROL", ROTERSRANKCONTROLOBJ);
} else {
RootTab["ROTERSRANKCONTROL"].Run(obj);
}
}