Beispiel #1
0
        /// <summary>
        /// Callback for executing an action (attack/sit/stand) to a target (ID)
        /// </summary>
        /// <param name="character"></param>
        /// <param name="action"></param>
        /// <param name="id"></param>
        private static void Callback_ActionRequest(Character character, byte action, int id)
        {
            // TODO: check for dead player
            // TODO: check for trickdead, autocounter or bladestop (no action available)

            character.StopWalking(0x1);
            character.StopAttack();

            // For disguise
            if (id < 0 && -id == character.AccountID)
            {
                id = (int)character.AccountID;
            }

            switch (action)
            {
            case 0x0:                     // Attack once
            case 0x7:                     // Attack continue
                if (character.CantAct() == false || (character.StatusChange.Option & EStatusOption.Hide) > 0)
                {
                    return;
                }
                EStatusOption badOptions = (EStatusOption.Wedding | EStatusOption.Xmas | EStatusOption.Summer);
                if ((character.StatusChange.Option & badOptions) > 0)
                {
                    return;
                }

                // TODO: basilica
                // TODO: freecast check

                character.ResetInvisibleTimer();
                character.Attack(id, (action != 0x0));
                break;

            case 0x02:                     // sitdown
                                           /*
                                            * if (battle_config.basic_skill_check && pc_checkskill(sd, NV_BASIC) < 3) {
                                            *      clif_skill_fail(sd, 1, 0, 2);
                                            *      break;
                                            * }
                                            */

                if (character.IsSit() == true)
                {
                    // Bugged client? Just refresh them
                    World.Send(new WorldUnitSitStand(character, true), character, ESendTarget.Area);
                    return;
                }

                if (Timer.IsValid(character.ActiveSkillTimer) == true || character.StatusChange.Option1 != EStatusOption1.None)
                {
                    break;
                }

                /*
                 * if (sd->sc.count && (
                 *      sd->sc.data[SC_DANCING] ||
                 *      (sd->sc.data[SC_GRAVITATION] && sd->sc.data[SC_GRAVITATION]->val3 == BCT_SELF)
                 * )) //No sitting during these states either.
                 *      break;
                 */
                character.SetSit();
                //skill_sit(sd, 1);
                World.Send(new WorldUnitSitStand(character, true), character, ESendTarget.Area);
                break;

            case 0x03:                     // standup
                if (character.IsSit() == false)
                {
                    World.Send(new WorldUnitSitStand(character, false), character, ESendTarget.Area);
                    return;
                }
                character.SetStand();
                //skill_sit(sd, 0);
                World.Send(new WorldUnitSitStand(character, false), character, ESendTarget.Area);
                break;
            }
        }
Beispiel #2
0
        public bool IsHiding()
        {
            EStatusOption hiddenOptions = (EStatusOption.Hide | EStatusOption.Cloak | EStatusOption.Chasewalk);

            return((StatusChange.Option & hiddenOptions) > 0);
        }