public void DoTakeItem(ItemInst item) { ScriptAniJob job = AniCatalog?.ItemHandling.TakeItem; if (job != null && ModelInst.TryGetAniFromJob(job, out ScriptAni ani)) { if (!ani.TryGetSpecialFrame(SpecialFrame.ItemHandle, out float frame)) { frame = float.MaxValue; } var pair = new FrameActionPair(frame, () => TakeItem(item)); ModelInst.StartAniJob(job, 0.8f, 0, pair); return; } TakeItem(item); }
private void DoAttack(ScriptAniJob job, FightMoves move, int fwdCombo = 0) { if (job == null) { return; } if (!ModelInst.TryGetAniFromJob(job, out ScriptAni ani)) { return; } // combo window if (!ani.TryGetSpecialFrame(SpecialFrame.Combo, out float comboFrame)) { comboFrame = ani.EndFrame; } var comboPair = new FrameActionPair(comboFrame, () => OpenCombo()); // hit frame if (!ani.TryGetSpecialFrame(SpecialFrame.Hit, out float hitFrame)) { hitFrame = comboFrame; } if (hitFrame > comboFrame) { hitFrame = comboFrame; } var hitPair = new FrameActionPair(hitFrame, () => CalcHit()); // end of animation var endPair = FrameActionPair.OnEnd(() => EndFightAni()); // start ani first, because the OnEnd-Callback from the former attack resets the fight stance FightAnimation = ModelInst.StartAniJob(job, comboPair, hitPair, endPair); CurrentFightMove = move; CanCombo = false; ComboNum = fwdCombo; }
private void DoDodge(ScriptAniJob job) { if (job == null) { return; } if (!ModelInst.TryGetAniFromJob(job, out ScriptAni ani)) { return; } // end of animation var endPair = FrameActionPair.OnEnd(() => EndFightAni()); FightAnimation = ModelInst.StartAniJob(job, endPair); CurrentFightMove = FightMoves.Dodge; CanCombo = false; ComboNum = 0; }
public void DoDropItem(ItemInst item, int amount, Vec3f position, Angles angles) { item = item.Split(amount); ScriptAniJob job = AniCatalog?.ItemHandling.DropItem; if (job != null && ModelInst.TryGetAniFromJob(job, out ScriptAni ani)) { if (!ani.TryGetSpecialFrame(SpecialFrame.ItemHandle, out float frame)) { frame = float.MaxValue; } var pair = new FrameActionPair(frame, () => DropItem(item, position, angles)); ModelInst.StartAniJob(job, 0.8f, 0, pair); return; } DropItem(item, position, angles); }
public void UseItem(ItemInst item) { if (item.ItemType != ItemTypes.Drinkable) { return; } ScriptAniJob job = AniCatalog?.ItemHandling.DrinkPotion; if (job != null && ModelInst.TryGetAniFromJob(job, out ScriptAni ani)) { if (!ani.TryGetSpecialFrame(SpecialFrame.ItemHandle, out float frame)) { frame = float.MaxValue; } EquipItem(NPCSlots.RightHand, item); var pair = new FrameActionPair(frame, () => ChugPotion(item)); ModelInst.StartAniJob(job, pair); return; } ChugPotion(item); }
public ActiveAni StartAniJob(ScriptAniJob aniJob, Action onEnd) { return(StartAniJob(aniJob, 1, 0, FrameActionPair.OnEnd(onEnd))); }