| 221 | } |
| 222 | |
| 223 | func TryRoomCommand(cmd string, rest string, userId int) (bool, error) { |
| 224 | |
| 225 | user := users.GetByUserId(userId) |
| 226 | if user == nil { |
| 227 | return false, errors.New("user not found") |
| 228 | } |
| 229 | |
| 230 | room := rooms.LoadRoom(user.Character.RoomId) |
| 231 | if room == nil { |
| 232 | return false, fmt.Errorf("room %d not found", user.Character.RoomId) |
| 233 | } |
| 234 | |
| 235 | altCmd, _ := room.FindExitByName(cmd) |
| 236 | |
| 237 | if room != nil { |
| 238 | |
| 239 | for _, mobInstanceId := range room.GetMobs() { |
| 240 | if handled, err := TryMobCommand(cmd, rest, mobInstanceId, userId, `user`); err == nil { |
| 241 | if handled { |
| 242 | return true, nil |
| 243 | } |
| 244 | } |
| 245 | |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | vmw, err := getRoomVM(user.Character.RoomId) |
| 250 | if err != nil { |
| 251 | return false, err |
| 252 | } |
| 253 | |
| 254 | timestart := time.Now() |
| 255 | defer func() { |
| 256 | mudlog.Debug("TryRoomCommand()", "cmd", cmd, "roomId", user.Character.RoomId, "time", time.Since(timestart)) |
| 257 | }() |
| 258 | |
| 259 | onCommandFunc, cmdFound := vmw.GetFunction(`onCommand_` + cmd) |
| 260 | if !cmdFound && altCmd != `` { |
| 261 | onCommandFunc, cmdFound = vmw.GetFunction(`onCommand_` + altCmd) |
| 262 | } |
| 263 | |
| 264 | if cmdFound { |
| 265 | |
| 266 | // Set forced ansi tag wrappers |
| 267 | userTextWrap.Set(`script-text`, ``, ``) |
| 268 | roomTextWrap.Set(`script-text`, ``, ``) |
| 269 | |
| 270 | sUser := GetUser(userId) |
| 271 | sRoom := GetRoom(user.Character.RoomId) |
| 272 | |
| 273 | res, err := runCallable(vmw, scriptRoomTimeout, onCommandFunc, |
| 274 | vmw.VM.ToValue(rest), |
| 275 | vmw.VM.ToValue(sUser), |
| 276 | vmw.VM.ToValue(sRoom), |
| 277 | ) |
| 278 | |
| 279 | userTextWrap.Reset() |
| 280 | roomTextWrap.Reset() |