Example #1
0
 protected SmartScriptSolutionItemProvider(string name, string desc, string icon, SmartScriptType type)
 {
     _name = name;
     _desc = desc;
     _type = type;
     _icon = new BitmapImage(new Uri($"/WDE.SmartScriptEditor;component/Resources/{icon}.png", UriKind.Relative));
 }
 protected SmartScriptSolutionItemProvider(string name, string desc, string icon, SmartScriptType type)
 {
     this.name = name;
     this.desc = desc;
     this.type = type;
     this.icon = new ImageUri($"Resources/{icon}.png");
 }
 public SmartScript(SmartScriptSolutionItem item, ISmartFactory smartFactory)
 {
     EntryOrGuid       = item.Entry;
     SourceType        = item.SmartType;
     Events            = new ObservableCollection <SmartEvent>();
     this.smartFactory = smartFactory;
 }
 public SmartScript(SmartScriptSolutionItem item, IUnityContainer container)
 {
     EntryOrGuid = item.Entry;
     SourceType  = item.SmartType;
     _container  = container;
     Events      = new ObservableCollection <SmartEvent>();
 }
Example #5
0
        public async Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
        {
            if (model == null)
            {
                return;
            }

            await model.BeginTransactionAsync();

            await model.SmartScript.Where(x => x.EntryOrGuid == entryOrGuid && x.ScriptSourceType == (int)type).DeleteAsync();

            if (type == SmartScriptType.Creature)
            {
                await model.CreatureTemplate
                .Where(p => p.Entry == entryOrGuid)
                .Set(p => p.AIName, "SmartAI")
                .Set(p => p.ScriptName, "")
                .UpdateAsync();
            }

            foreach (var line in script)
            {
                MySqlSmartScriptLine sqlLine = new ()
                {
                    EntryOrGuid      = line.EntryOrGuid,
                    ScriptSourceType = line.ScriptSourceType,
                    Id               = line.Id,
                    Link             = line.Link,
                    EventType        = line.EventType,
                    EventPhaseMask   = line.EventPhaseMask,
                    EventChance      = line.EventChance,
                    EventFlags       = line.EventFlags,
                    EventParam1      = line.EventParam1,
                    EventParam2      = line.EventParam2,
                    EventParam3      = line.EventParam3,
                    EventParam4      = line.EventParam4,
                    EventCooldownMin = line.EventCooldownMin,
                    EventCooldownMax = line.EventCooldownMax,
                    ActionType       = line.ActionType,
                    ActionParam1     = line.ActionParam1,
                    ActionParam2     = line.ActionParam2,
                    ActionParam3     = line.ActionParam3,
                    ActionParam4     = line.ActionParam4,
                    ActionParam5     = line.ActionParam5,
                    ActionParam6     = line.ActionParam6,
                    TargetType       = line.TargetType,
                    TargetParam1     = line.TargetParam1,
                    TargetParam2     = line.TargetParam2,
                    TargetParam3     = line.TargetParam3,
                    TargetX          = line.TargetX,
                    TargetY          = line.TargetY,
                    TargetZ          = line.TargetZ,
                    TargetO          = line.TargetO,
                    Comment          = line.Comment
                };
                await model.InsertAsync(sqlLine);
            }
            await model.CommitTransactionAsync();
        }
Example #6
0
 public IEnumerable <ISmartScriptLine> GetScriptFor(int entryOrGuid, SmartScriptType type)
 {
     if (model == null)
     {
         return(new List <ISmartScriptLine>());
     }
     return(model.SmartScript.Where((line) => line.EntryOrGuid == entryOrGuid && line.ScriptSourceType == (int)type).ToList());
 }
        public async Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
        {
            using var writeLock = await MySqlSingleWriteLock.WriteLock();

            await using var model = new TrinityDatabase();

            await model.BeginTransactionAsync(IsolationLevel.ReadCommitted);

            await model.SmartScript.Where(x => x.EntryOrGuid == entryOrGuid && x.ScriptSourceType == (int)type).DeleteAsync();

            switch (type)
            {
            case SmartScriptType.Creature:
                await model.CreatureTemplate.Where(p => p.Entry == (uint)entryOrGuid)
                .Set(p => p.AIName, "SmartAI")
                .Set(p => p.ScriptName, "")
                .UpdateAsync();

                break;

            case SmartScriptType.GameObject:
                await model.GameObjectTemplate.Where(p => p.Entry == (uint)entryOrGuid)
                .Set(p => p.AIName, "SmartAI")
                .Set(p => p.ScriptName, "")
                .UpdateAsync();

                break;

            case SmartScriptType.AreaTrigger:
                await model.AreaTriggerScript.Where(p => p.Id == entryOrGuid).DeleteAsync();

                await model.AreaTriggerScript.InsertAsync(() => new MySqlAreaTriggerScript()
                {
                    Id = entryOrGuid, ScriptName = "SmartTrigger"
                });

                break;

            case SmartScriptType.AreaTriggerEntity:
                await model.AreaTriggerTemplate.Where(p => p.Id == (uint)entryOrGuid && p.IsServerSide == false)
                .Set(p => p.ScriptName, "SmartAreaTriggerAI")
                .UpdateAsync();

                break;

            case SmartScriptType.AreaTriggerEntityServerSide:
                await model.AreaTriggerTemplate.Where(p => p.Id == (uint)entryOrGuid && p.IsServerSide == true)
                .Set(p => p.ScriptName, "SmartAreaTriggerAI")
                .UpdateAsync();

                break;
            }

            await model.SmartScript.BulkCopyAsync(script.Select(l => new MySqlSmartScriptLine(l)));

            await model.CommitTransactionAsync();
        }
        public async Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IList <ISmartScriptLine> script)
        {
            using var writeLock = await DatabaseLock.WriteLock();

            await using var model = Database();

            await model.BeginTransactionAsync(IsolationLevel.ReadCommitted);

            foreach (var pair in script.Select(l => (l.ScriptSourceType, l.EntryOrGuid))
                     .Concat(new (int ScriptSourceType, int EntryOrGuid)[] { ((int)type, entryOrGuid) })
Example #9
0
        private string?TryGetName(int entryOrGuid, SmartScriptType type)
        {
            uint?entry = 0;

            switch (type)
            {
            case SmartScriptType.Creature:
                if (entryOrGuid < 0)
                {
                    entry = database.GetCreatureByGuid((uint)-entryOrGuid)?.Entry;
                }
                else
                {
                    entry = (uint)entryOrGuid;
                }

                if (entry.HasValue)
                {
                    return(database.GetCreatureTemplate(entry.Value)?.Name);
                }
                break;

            case SmartScriptType.GameObject:
                if (entryOrGuid < 0)
                {
                    entry = database.GetGameObjectByGuid((uint)-entryOrGuid)?.Entry;
                }
                else
                {
                    entry = (uint)entryOrGuid;
                }

                if (entry.HasValue)
                {
                    return(database.GetGameObjectTemplate(entry.Value)?.Name);
                }
                break;

            case SmartScriptType.Quest:
                return(database.GetQuestTemplate((uint)entryOrGuid)?.Name);

            case SmartScriptType.Aura:
            case SmartScriptType.Spell:
                if (spellStore.HasSpell((uint)entryOrGuid))
                {
                    return(spellStore.GetName((uint)entryOrGuid));
                }
                break;

            default:
                return(null);
            }

            return(null);
        }
Example #10
0
        public void InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
        {
            if (model == null)
            {
                return;
            }

            using (var scope = new TransactionScope())
            {
                model.SmartScript.Where(x => x.EntryOrGuid == entryOrGuid && x.ScriptSourceType == (int)type).Delete();

                scope.Flush();

                foreach (var line in script)
                {
                    var sqlLine = model.SmartScript.Create(new { EntryOrGuid = line.EntryOrGuid, ScriptSourceType = line.ScriptSourceType, Id = line.Id });
                    sqlLine.Link              = line.Link;
                    sqlLine.EventType         = line.EventType;
                    sqlLine.EventPhaseMask    = line.EventPhaseMask;
                    sqlLine.EventChance       = line.EventChance;
                    sqlLine.EventFlags        = line.EventFlags;
                    sqlLine.EventParam1       = line.EventParam1;
                    sqlLine.EventParam2       = line.EventParam2;
                    sqlLine.EventParam3       = line.EventParam3;
                    sqlLine.EventParam4       = line.EventParam4;
                    sqlLine.EventCooldownMin  = line.EventCooldownMin;
                    sqlLine.EventCooldownMax  = line.EventCooldownMax;
                    sqlLine.ActionType        = line.ActionType;
                    sqlLine.ActionParam1      = line.ActionParam1;
                    sqlLine.ActionParam2      = line.ActionParam2;
                    sqlLine.ActionParam3      = line.ActionParam3;
                    sqlLine.ActionParam4      = line.ActionParam4;
                    sqlLine.ActionParam5      = line.ActionParam5;
                    sqlLine.ActionParam6      = line.ActionParam6;
                    sqlLine.SourceType        = line.SourceType;
                    sqlLine.SourceParam1      = line.SourceParam1;
                    sqlLine.SourceParam2      = line.SourceParam2;
                    sqlLine.SourceParam3      = line.SourceParam3;
                    sqlLine.SourceConditionId = line.SourceConditionId;
                    sqlLine.TargetType        = line.TargetType;
                    sqlLine.TargetParam1      = line.TargetParam1;
                    sqlLine.TargetParam2      = line.TargetParam2;
                    sqlLine.TargetParam3      = line.TargetParam3;
                    sqlLine.TargetConditionId = line.TargetConditionId;
                    sqlLine.TargetX           = line.TargetX;
                    sqlLine.TargetY           = line.TargetY;
                    sqlLine.TargetZ           = line.TargetZ;
                    sqlLine.TargetO           = line.TargetO;
                    sqlLine.Comment           = line.Comment;
                }
                scope.Complete();
            }
        }
 public SmartScriptAreaTriggerEntityListProviderBase(
     Lazy <IItemFromListProvider> itemFromListProvider,
     Lazy <IDatabaseProvider> database,
     string name,
     string desc,
     string icon,
     SmartScriptType type,
     bool serverSide
     ) : base(name, desc, icon, type)
 {
     this.itemFromListProvider = itemFromListProvider;
     this.database             = database;
     this.type       = type;
     this.serverSide = serverSide;
 }
Example #12
0
        public SmartScript(ISmartScriptSolutionItem item,
                           ISmartFactory smartFactory,
                           ISmartDataManager smartDataManager,
                           IMessageBoxService messageBoxService)
        {
            this.smartFactory      = smartFactory;
            this.smartDataManager  = smartDataManager;
            this.messageBoxService = messageBoxService;
            EntryOrGuid            = (int)item.Entry;
            SourceType             = item.SmartType;
            Events          = new ObservableCollection <SmartEvent>();
            selectionHelper = new SmartSelectionHelper(this);
            selectionHelper.ScriptSelectedChanged += CallScriptSelectedChanged;
            AllSmartObjectsFlat = selectionHelper.AllSmartObjectsFlat;

            Events.ToStream()
            .Subscribe((e) =>
            {
                if (e.Type == CollectionEventType.Add)
                {
                    e.Item.Parent = this;
                }
            });
        }
Example #13
0
 public Task <IList <int> > GetSmartScriptEntriesByType(SmartScriptType scriptType) =>
 impl.GetSmartScriptEntriesByType(scriptType);
 public Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
 {
     return(Task.FromResult(false));
 }
        public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scriptEntryOrGuid, SmartScriptType scriptSourceType, int id, int?linkTo = null)
        {
            List <ISmartScriptLine>   lines   = new List <ISmartScriptLine>();
            IEnumerable <SmartAction> actions = e.Actions.Count == 0 ? new List <SmartAction>()
            {
                new SmartAction(-1, new SmartSource(-1)
                {
                    ReadableHint = ""
                }, new SmartTarget(-1)
                {
                    ReadableHint = ""
                })
                {
                    ReadableHint = ""
                }
            } : e.Actions;

            foreach (var a in actions)
            {
                var line = new AbstractSmartScriptLine()
                {
                    EntryOrGuid      = scriptEntryOrGuid,
                    ScriptSourceType = (int)scriptSourceType,
                    Id                = id,
                    Link              = linkTo ?? 0,
                    EventType         = e.Id,
                    EventPhaseMask    = e.Phases.Value,
                    EventChance       = e.Chance.Value,
                    EventFlags        = e.Flags.Value,
                    EventParam1       = e.GetParameter(0).Value,
                    EventParam2       = e.GetParameter(1).Value,
                    EventParam3       = e.GetParameter(2).Value,
                    EventParam4       = e.GetParameter(3).Value,
                    EventCooldownMin  = e.CooldownMin.Value,
                    EventCooldownMax  = e.CooldownMax.Value,
                    ActionType        = a.Id,
                    ActionParam1      = a.GetParameter(0).Value,
                    ActionParam2      = a.GetParameter(1).Value,
                    ActionParam3      = a.GetParameter(2).Value,
                    ActionParam4      = a.GetParameter(3).Value,
                    ActionParam5      = a.GetParameter(4).Value,
                    ActionParam6      = a.GetParameter(5).Value,
                    SourceType        = a.Source.Id,
                    SourceParam1      = a.Source.GetParameter(0).Value,
                    SourceParam2      = a.Source.GetParameter(1).Value,
                    SourceParam3      = a.Source.GetParameter(2).Value,
                    SourceConditionId = 0,
                    TargetType        = a.Target.Id,
                    TargetParam1      = a.Target.GetParameter(0).Value,
                    TargetParam2      = a.Target.GetParameter(1).Value,
                    TargetParam3      = a.Target.GetParameter(2).Value,
                    TargetConditionId = 0,
                    TargetX           = a.Target.X,
                    TargetY           = a.Target.Y,
                    TargetZ           = a.Target.Z,
                    TargetO           = a.Target.O,
                    Comment           = e.Readable + " - " + a.Readable + (string.IsNullOrEmpty(a.Comment) ? "" : (" // " + a.Comment)),
                };
                lines.Add(line);
            }

            return(lines.ToArray());
        }
Example #16
0
 public SmartScriptSolutionItem(int entry, SmartScriptType type, IUnityContainer unity)
 {
     Entry     = entry;
     SmartType = type;
     _unity    = unity;
 }
 public IEnumerable <IConditionLine> GetConditionsForSourceTarget(int entryOrGuid, SmartScriptType type) => Enumerable.Empty <IConditionLine>();
 public Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
 {
     return(databaseProvider.InstallScriptFor(entryOrGuid, type, script));
 }
Example #19
0
 public IEnumerable <ISmartScriptLine> GetScriptFor(int entryOrGuid, SmartScriptType type)
 {
     using var model = new TrinityDatabase();
     return(model.SmartScript.Where(line => line.EntryOrGuid == entryOrGuid && line.ScriptSourceType == (int)type).ToList());
 }
        public async Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script)
        {
            using var writeLock = await DatabaseLock.WriteLock();

            await using var model = Database();

            await model.BeginTransactionAsync(IsolationLevel.ReadCommitted);

            await model.SmartScript.Where(x => x.EntryOrGuid == entryOrGuid && x.ScriptSourceType == (int)type).DeleteAsync();

            switch (type)
            {
            case SmartScriptType.Creature:
            {
                uint entry = 0;
                if (entryOrGuid < 0)
                {
                    var template = await model.Creature.Where(p => p.Guid == (uint)-entryOrGuid).FirstOrDefaultAsync();

                    if (template == null)
                    {
                        throw new Exception(
                                  $"Trying to install creature script for guid {-entryOrGuid}, but this guid doesn't exist in creature table, so entry cannot be determined.");
                    }
                    entry = template.Entry;
                }
                else
                {
                    entry = (uint)entryOrGuid;
                }
                await model.CreatureTemplate.Where(p => p.Entry == entry)
                .Set(p => p.AIName, currentCoreVersion.Current.SmartScriptFeatures.CreatureSmartAiName)
                .Set(p => p.ScriptName, "")
                .UpdateAsync();

                break;
            }

            case SmartScriptType.GameObject:
            {
                uint entry = 0;
                if (entryOrGuid < 0)
                {
                    var template = await model.GameObject.Where(p => p.Guid == (uint)-entryOrGuid).FirstOrDefaultAsync();

                    if (template == null)
                    {
                        throw new Exception(
                                  $"Trying to install gameobject script for guid {-entryOrGuid}, but this guid doesn't exist in gameobject table, so entry cannot be determined.");
                    }
                    entry = template.Entry;
                }
                else
                {
                    entry = (uint)entryOrGuid;
                }
                await model.GameObjectTemplate.Where(p => p.Entry == entry)
                .Set(p => p.AIName, currentCoreVersion.Current.SmartScriptFeatures.GameObjectSmartAiName)
                .Set(p => p.ScriptName, "")
                .UpdateAsync();

                break;
            }

            case SmartScriptType.Quest:
                var addonExists = await model.QuestTemplateAddon.Where(p => p.Entry == (uint)entryOrGuid).AnyAsync();

                if (!addonExists)
                {
                    await model.QuestTemplateAddon.InsertAsync(() => new MySqlQuestTemplateAddon()
                    {
                        Entry = (uint)entryOrGuid
                    });
                }
                await model.QuestTemplateAddonWithScriptName
                .Where(p => p.Entry == (uint)entryOrGuid)
                .Set(p => p.ScriptName, "SmartQuest")
                .UpdateAsync();

                break;

            case SmartScriptType.AreaTrigger:
                await model.AreaTriggerScript.Where(p => p.Id == entryOrGuid).DeleteAsync();

                await model.AreaTriggerScript.InsertAsync(() => new MySqlAreaTriggerScript()
                {
                    Id = entryOrGuid, ScriptName = "SmartTrigger"
                });

                break;

            case SmartScriptType.AreaTriggerEntity:
                await model.AreaTriggerTemplate.Where(p => p.Id == (uint)entryOrGuid && p.IsServerSide == false)
                .Set(p => p.ScriptName, "SmartAreaTriggerAI")
                .UpdateAsync();

                break;

            case SmartScriptType.AreaTriggerEntityServerSide:
                await model.AreaTriggerTemplate.Where(p => p.Id == (uint)entryOrGuid && p.IsServerSide == true)
                .Set(p => p.ScriptName, "SmartAreaTriggerAI")
                .UpdateAsync();

                break;
            }

            await model.SmartScript.BulkCopyAsync(script.Select(l => new MySqlSmartScriptLine(l)));

            await model.CommitTransactionAsync();
        }
 public IEnumerable <ISmartScriptLine> GetScriptFor(int entryOrGuid, SmartScriptType type)
 {
     return(databaseProvider.GetScriptFor(entryOrGuid, type));
 }
 public Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IEnumerable <ISmartScriptLine> script) =>
 impl.InstallScriptFor(entryOrGuid, type, script);
 public SmartScriptSolutionItem(int entry, SmartScriptType type)
 {
     Entry     = entry;
     SmartType = type;
 }
Example #24
0
 public Task InstallScriptFor(int entryOrGuid, SmartScriptType type, IList <ISmartScriptLine> script) => Task.FromResult(false);
 public IEnumerable <ISmartScriptLine> GetScriptFor(int entryOrGuid, SmartScriptType type) =>
 impl.GetScriptFor(entryOrGuid, type);
 public Task <IEnumerable <ISmartScriptLine> > GetScriptFor(int entryOrGuid, SmartScriptType type)
 {
     return(Task.FromResult(databaseProvider.GetScriptFor(entryOrGuid, type)));
 }
Example #27
0
 public IEnumerable <ISmartScriptLine> GetScriptFor(int entryOrGuid, SmartScriptType type) => Enumerable.Empty <ISmartScriptLine>();
 public IEnumerable <IConditionLine> GetConditionsForScript(int entryOrGuid, SmartScriptType type)
 {
     return(databaseProvider.GetConditionsFor(SmartConstants.ConditionSourceSmartScript, entryOrGuid, (int)type));
 }
Example #29
0
 public Task <IList <int> > GetSmartScriptEntriesByType(SmartScriptType scriptType) =>
 Task.FromResult <IList <int> >(new List <int>());
 public async Task InstallConditionsForScript(IEnumerable <IConditionLine> conditions, int entryOrGuid, SmartScriptType type)
 {
     await databaseProvider.InstallConditions(conditions,
                                              IDatabaseProvider.ConditionKeyMask.SourceEntry | IDatabaseProvider.ConditionKeyMask.SourceId,
                                              new IDatabaseProvider.ConditionKey(SmartConstants.ConditionSourceSmartScript, null, entryOrGuid, (int)type));
 }