(cmd string, rest string, mobInstanceId int, sourceId int, sourceType string)
| 137 | } |
| 138 | |
| 139 | func TryMobCommand(cmd string, rest string, mobInstanceId int, sourceId int, sourceType string) (bool, error) { |
| 140 | |
| 141 | sMob := GetActor(0, mobInstanceId) |
| 142 | if sMob == nil { |
| 143 | PruneMobVMs(mobInstanceId) |
| 144 | return false, fmt.Errorf("mob not found") |
| 145 | } |
| 146 | |
| 147 | vmw, err := getMobVM(sMob) |
| 148 | if err != nil { |
| 149 | return false, err |
| 150 | } |
| 151 | |
| 152 | timestart := time.Now() |
| 153 | defer func() { |
| 154 | mudlog.Debug("TryMobCommand()", "cmd", cmd, "MobId", sMob.MobTypeId(), "time", time.Since(timestart)) |
| 155 | }() |
| 156 | |
| 157 | if onCommandFunc, ok := vmw.GetFunction(`onCommand_` + cmd); ok { |
| 158 | |
| 159 | details := map[string]interface{}{ |
| 160 | `sourceId`: sourceId, |
| 161 | `sourceType`: sourceType, |
| 162 | } |
| 163 | |
| 164 | sRoom := GetRoom(sMob.mobRecord.Character.RoomId) |
| 165 | |
| 166 | res, err := runCallable(vmw, scriptRoomTimeout, onCommandFunc, |
| 167 | vmw.VM.ToValue(rest), |
| 168 | vmw.VM.ToValue(sMob), |
| 169 | vmw.VM.ToValue(sRoom), |
| 170 | vmw.VM.ToValue(details), |
| 171 | ) |
| 172 | if err != nil { |
| 173 | return false, fmt.Errorf("onCommand_%s(): %w", cmd, err) |
| 174 | } |
| 175 | |
| 176 | if boolVal, ok := res.Export().(bool); ok { |
| 177 | return boolVal, nil |
| 178 | } |
| 179 | |
| 180 | } else if onCommandFunc, ok := vmw.GetFunction(`onCommand`); ok { |
| 181 | |
| 182 | details := map[string]interface{}{ |
| 183 | `sourceId`: sourceId, |
| 184 | `sourceType`: sourceType, |
| 185 | } |
| 186 | |
| 187 | sRoom := GetRoom(sMob.GetRoomId()) |
| 188 | |
| 189 | res, err := runCallable(vmw, scriptRoomTimeout, onCommandFunc, |
| 190 | vmw.VM.ToValue(cmd), |
| 191 | vmw.VM.ToValue(rest), |
| 192 | vmw.VM.ToValue(sMob), |
| 193 | vmw.VM.ToValue(sRoom), |
| 194 | vmw.VM.ToValue(details), |
| 195 | ) |
| 196 | if err != nil { |
no test coverage detected