Ejemplo n.º 1
0
        private bool SetPosition(VMEntity entity, LotTilePos pos, float radDir, bool shooAva, VMContext context)
        {
            var posChange = entity.SetPosition(pos, (Direction)(1 << (int)(Math.Round(DirectionUtils.PosMod(radDir, (float)Math.PI * 2) / (Math.PI / 4)) % 8)), context);

            if (posChange.Status != VMPlacementError.Success)
            {
                if (shooAva && posChange.Object != null && posChange.Object is VMAvatar)
                {
                    if (!posChange.Object.Thread.Queue.Any(x => x.Callee != null && x.Callee.Object.GUID == GOTO_GUID && x.InteractionNumber == SHOO_INTERACTION))
                    {
                        //push shoo if not already being shooed
                        VMEntity callee = context.VM.Context.CreateObjectInstance(GOTO_GUID, new LotTilePos(posChange.Object.Position), Direction.NORTH).Objects[0];
                        callee.PushUserInteraction(SHOO_INTERACTION, posChange.Object, context.VM.Context, false);
                    }
                }
                if (posChange.Status == VMPlacementError.LocationOutOfBounds)
                {
                    entity.SetValue(VMStackObjectVariable.PrimitiveResult, 2);
                }
                entity.SetValue(VMStackObjectVariable.PrimitiveResultID, (posChange.Object == null) ? (short)0 : posChange.Object.ObjectID);
                return(false);
            }
            if (entity is VMAvatar)
            {
                entity.RadianDirection = radDir;
            }
            return(true);
        }
Ejemplo n.º 2
0
        public override bool Execute(VM vm, VMAvatar caller)
        {
            VMEntity callee = vm.GetObjectById(CalleeID);

            if (caller == null && CallerID > 0)
            {
                //try get caller from normal id;
                caller = (vm.GetObjectById(CallerID) as VMAvatar);
                if (caller == null)
                {
                    return(false);
                }
            }
            if (callee == null)
            {
                return(false);
            }
            if (callee is VMGameObject && ((VMGameObject)callee).Disabled > 0)
            {
                return(false);
            }
            if ((caller.Thread?.Queue?.Count ?? 0) >= VMThread.MAX_USER_ACTIONS)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context, Global, new short[] { Param0, 0, 0, 0 });

            return(true);
        }
Ejemplo n.º 3
0
        public override bool Execute(VM vm)
        {
            VMEntity callee = vm.GetObjectById(CalleeID);
            VMEntity caller = vm.Entities.FirstOrDefault(x => x.PersistID == ActorUID);

            if (callee == null || caller == null)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context, new short[] { Param0, 0, 0, 0 });

            return(true);
        }
Ejemplo n.º 4
0
        public override bool Execute(VM vm)
        {
            VMEntity callee = vm.Context.CreateObjectInstance(GOTO_GUID, new LotTilePos(x, y, level), Direction.NORTH).Objects[0];
            VMEntity caller = vm.Entities.FirstOrDefault(x => x.PersistID == ActorUID);

            //TODO: check if net user owns caller!
            if (callee == null || callee.Position == LotTilePos.OUT_OF_WORLD || caller == null)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context);

            return(true);
        }
Ejemplo n.º 5
0
        public override bool Execute(VM vm)
        {
            VMEntity callee = vm.GetObjectById(CalleeID);
            VMEntity caller = vm.GetObjectById(CallerID);

            //TODO: check if net user owns caller!
            if (callee == null || caller == null)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context, new short[] { Param0, 0, 0, 0 });

            return(true);
        }
Ejemplo n.º 6
0
        public override bool Execute(VM vm, VMAvatar caller)
        {
            VMEntity callee = vm.GetObjectById(CalleeID);

            if (callee == null || caller == null)
            {
                return(false);
            }
            if (callee is VMGameObject && ((VMGameObject)callee).Disabled > 0)
            {
                return(false);
            }
            if (caller.Thread.Queue.Count >= VMThread.MAX_USER_ACTIONS)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context, Global, new short[] { Param0, 0, 0, 0 });

            return(true);
        }
Ejemplo n.º 7
0
        public override bool Execute(VM vm, VMAvatar caller)
        {
            if (caller == null)
            {
                return(false);
            }
            if (caller.Thread.Queue.Count >= VMThread.MAX_USER_ACTIONS)
            {
                return(false);
            }
            VMEntity callee = vm.Context.CreateObjectInstance(GOTO_GUID, new LotTilePos(x, y, level), Direction.NORTH).Objects[0];

            if (callee?.Position == LotTilePos.OUT_OF_WORLD)
            {
                callee.Delete(true, vm.Context);
            }
            if (callee == null)
            {
                return(false);
            }
            callee.PushUserInteraction(Interaction, caller, vm.Context, false);

            return(true);
        }
Ejemplo n.º 8
0
        private void PieButtonClick(UIElement button)
        {
            int index = m_PieButtons.IndexOf((UIButton)button);

            if (index == -1)
            {
                return;              //bail! this isn't meant to happen!
            }
            var action = m_CurrentItem.Children.ElementAt(index).Value;

            HITVM.Get().PlaySoundEvent(UISounds.PieMenuSelect);

            if (action.Category)
            {
                m_CurrentItem = action;
                RenderMenu();
            }
            else
            {
                m_Obj.PushUserInteraction(action.ID, m_Caller, m_Parent.vm.Context);
                HITVM.Get().PlaySoundEvent(UISounds.QueueAdd);
                m_Parent.ClosePie();
            }
        }
Ejemplo n.º 9
0
        public override VMPrimitiveExitCode Execute(VMStackFrame context, VMPrimitiveOperand args)
        {
            var ents      = new List <VMEntity>(context.VM.Entities);
            var processed = new HashSet <short>();
            var pos1      = context.Caller.Position;

            VMEntity             bestActor  = null;
            VMPieMenuInteraction bestAction = null;
            int bestScore = 0;

            foreach (var iobj in ents)
            {
                var obj = iobj.MultitileGroup.GetInteractionGroupLeader(iobj);
                if (processed.Contains(obj.ObjectID))
                {
                    continue;
                }
                processed.Add(obj.ObjectID);

                var pos2     = obj.Position;
                var distance = (short)Math.Floor(Math.Sqrt(Math.Pow(pos1.x - pos2.x, 2) + Math.Pow(pos1.y - pos2.y, 2)) / 16.0);

                var pie         = obj.GetPieMenu(context.VM, context.Caller, true);
                int bestMyScore = 0;
                VMPieMenuInteraction bestMyAction = null;
                foreach (var item in pie)
                {
                    //motive scores must be above their threshold.
                    //pick maximum motive score as our base score
                    int baseScore = 0;
                    for (int i = 0; i < item.Entry.MotiveEntries.Length; i++)
                    {
                        var motiveScore = item.Entry.MotiveEntries[i];
                        if (motiveScore.EffectRangeMaximum == 0 && motiveScore.EffectRangeMinimum == 0)
                        {
                            continue;
                        }
                        //LINEAR INTERPOLATE MIN SCORE TO MAX, using motive data of caller
                        //MAX is when motive is the lowest.
                        //can be in reverse too!
                        var myMotive = Math.Max((short)0, ((VMAvatar)context.Caller).GetMotiveData((VMMotive)i)); //below mid motives causes max atten right now.

                        int interpScore = (myMotive * motiveScore.EffectRangeMinimum + (100 - myMotive) * (motiveScore.EffectRangeMinimum + motiveScore.EffectRangeMaximum)) / 100;
                        if (interpScore > baseScore)
                        {
                            baseScore = interpScore;
                        }
                    }
                    float atten      = (item.Entry.AttenuationCode == 0) ? item.Entry.AttenuationValue : TTAB.AttenuationValues[item.Entry.AttenuationCode];
                    int   attenScore = (int)Math.Max(0, baseScore * (1f - (distance * atten)));
                    if (attenScore != 0)
                    {
                        attenScore += (int)context.VM.Context.NextRandom(31) - 15;
                    }
                    if (attenScore > item.Entry.AutonomyThreshold && attenScore > bestMyScore)
                    {
                        bestMyScore  = attenScore;
                        bestMyAction = item;
                    }
                }

                if (bestMyAction != null && bestMyScore > bestScore)
                {
                    bestActor  = obj;
                    bestAction = bestMyAction;
                    bestScore  = bestMyScore;
                }
            }

            if (bestActor != null)
            {
                bestActor.PushUserInteraction(bestAction.ID, context.Caller, context.VM.Context, new short[] { bestAction.Param0, 0, 0, 0 });
                return(VMPrimitiveExitCode.GOTO_TRUE);
            }

            return(VMPrimitiveExitCode.GOTO_FALSE); //we couldn't find anything... because we didn't check! TODO!!
        }