FSO.SimAntics.VMArchitecture.RunCommands C# (CSharp) Method

RunCommands() public method

public RunCommands ( List commands, bool transient ) : int
commands List
transient bool
return int
        public int RunCommands(List<VMArchitectureCommand> commands, bool transient)
        {
            int cost = 0; //negative for sellback;
            int pdCount = 0;
            ushort pdVal = 0;
            VMAvatar lastAvatar = null;
            for (var i=0; i<commands.Count; i++)
            {
                var com = commands[i];
                var avaEnt = Context.VM.Entities.FirstOrDefault(x => x.PersistID == com.CallerUID);
                if ((avaEnt == null || avaEnt is VMGameObject) && !transient) return 0; //we need an avatar to run a command from net
                var avatar = (transient)? null : (VMAvatar)avaEnt;
                lastAvatar = avatar;
                var styleInd = -1;
                var walls = Content.Content.Get().WorldWalls;
                walls.WallStyleToIndex.TryGetValue(com.style, out styleInd);
                //if patterns are invalid, don't do anything.
                switch (com.Type)
                {
                    case VMArchitectureCommandType.WALL_LINE:
                        if (styleInd == -1) break; //MUST be purchasable style
                        var lstyle = walls.GetWallStyle(com.style);
                        var nwCount = VMArchitectureTools.DrawWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level, false);
                        if (nwCount > 0)
                        {
                            cost += nwCount * lstyle.Price;
                            if (avatar != null)
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                            avatar.Name,
                            Context.VM.GetUserIP(avatar.PersistID),
                            "placed " + nwCount + " walls."
                            ));
                        }
                        break;
                    case VMArchitectureCommandType.WALL_DELETE:
                        var dwCount = VMArchitectureTools.EraseWall(this, new Point(com.x, com.y), com.x2, com.y2, com.pattern, com.style, com.level);
                        if (dwCount > 0)
                        {
                            cost -= 7 * dwCount;
                            if (avatar != null)
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                            avatar.Name,
                            Context.VM.GetUserIP(avatar.PersistID),
                            "erased " + dwCount + " walls."
                            ));
                        }
                        break;
                    case VMArchitectureCommandType.WALL_RECT:
                        if (styleInd == -1) break; //MUST be purchasable style
                        var rstyle = walls.GetWallStyle(com.style);
                        var rwCount = VMArchitectureTools.DrawWallRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.pattern, com.style, com.level);
                        if (rwCount > 0)
                        {
                            cost += rwCount * rstyle.Price;
                            if (avatar != null)
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                            avatar.Name,
                            Context.VM.GetUserIP(avatar.PersistID),
                            "placed " + rwCount + " walls (rect)."
                        ));
                        }
                        break;
                    case VMArchitectureCommandType.PATTERN_FILL:
                        var pattern = GetPatternRef(com.pattern);
                        if (pattern == null && com.pattern != 0) break;
                        var pfCount = VMArchitectureTools.WallPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                        if (pfCount.Total > 0)
                        {
                            cost -= pfCount.Cost - pfCount.Cost / 5;
                            cost += (pattern == null) ? 0 : pattern.Price * pfCount.Total;
                            if (avatar != null)
                                Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                            avatar.Name,
                            Context.VM.GetUserIP(avatar.PersistID),
                            "pattern filled " + pfCount + " walls with pattern #" + com.pattern
                        ));
                        }
                        break;
                    case VMArchitectureCommandType.PATTERN_DOT:
                        var pdpattern = GetPatternRef(com.pattern);
                        if (pdpattern == null && com.pattern != 0) break;
                        var dot = VMArchitectureTools.WallPatternDot(this, new Point(com.x, com.y), com.pattern, com.x2, com.y2, com.level);
                        pdVal = com.pattern;
                        if (dot.Total > -1)
                        {
                            cost -= dot.Cost - dot.Cost / 5;
                            cost += (pdpattern == null) ? 0 : pdpattern.Price;
                            pdCount++;
                        }

                        break;
                    case VMArchitectureCommandType.FLOOR_FILL:
                        var ffpattern = GetFloorRef(com.pattern);
                        if (ffpattern == null && com.pattern != 0) break;
                        var ffCount = VMArchitectureTools.FloorPatternFill(this, new Point(com.x, com.y), com.pattern, com.level);
                        if (ffCount.Total > 0)
                        {
                            cost -= (ffCount.Cost - ffCount.Cost / 5)/2;
                            cost += (ffpattern == null) ? 0 : ffpattern.Price * ffCount.Total / 2;

                            if (avatar != null)
                            Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                            avatar.Name,
                            Context.VM.GetUserIP(avatar.PersistID),
                            "floor filled " + ffCount.Total / 2f + " with pattern #" + com.pattern
                            ));
                        }
                        break;
                    case VMArchitectureCommandType.FLOOR_RECT:
                        var frpattern = GetFloorRef(com.pattern);
                        if (frpattern == null && com.pattern != 0) break;
                        var frCount = VMArchitectureTools.FloorPatternRect(this, new Rectangle(com.x, com.y, com.x2, com.y2), com.style, com.pattern, com.level);
                        if (frCount.Total > 0)
                        {
                            cost -= (frCount.Cost - frCount.Cost / 5) / 2;
                            cost += (frpattern == null) ? 0 : frpattern.Price * frCount.Total / 2;

                            if (avatar != null)
                                Context.VM.SignalChatEvent(new VMChatEvent(avatar.PersistID, VMChatEventType.Arch,
                                avatar.Name,
                                Context.VM.GetUserIP(avatar.PersistID),
                                "placed " + frCount.Total / 2f + " tiles with pattern #" + com.pattern
                            ));
                        }
                        break;
                }
            }
            if (lastAvatar != null && pdCount > 0)
                Context.VM.SignalChatEvent(new VMChatEvent(lastAvatar.PersistID, VMChatEventType.Arch,
                lastAvatar.Name,
                Context.VM.GetUserIP(lastAvatar.PersistID),
                "pattern dotted " + pdCount + " walls with pattern #" + pdVal
            ));

            return cost;
        }