-
Posts
484 -
Joined
-
Last visited
Reputation Activity
-
ScripterQQ reacted to Matenia in String concatenation + "any character"
UnitBuff doesn't allow for regex afaik. Just iterate all buffs and use string.match or w/e the Lua function is on each name to do a partial match.
In Lua ".." concatenates 2 strings. If you want to use a "." in regex without it representing any character, you can escape it using "\"
-
ScripterQQ reacted to Matenia in GetTime() problems
The API docs are outdated or incorrect and that sentence is a reference to TBC, where you couldn't see ANY durations (no timeLeft either) if it's not casted by you. I thought it was pretty common knowledge that in WotLK you can see all durations at all times. This is exactly what the default UI does - how do you think it draws cooldown frames or addons like OmniCC wrap timers over them?
So to take my original post from weeks ago:
local _, _, _, _, _, duration, expiration = UnitDebuff("player", "Polymorph") local timeLeft = expiration - GetTime() -- timeLeft in seconds local timeAlreadyPassed = duration - timeLeft -- time the debuff has been applied to the target in seconds if (timeAlreadyPassed > 2) then CastSpellByName('Simple Logic') end
-
ScripterQQ reacted to Matenia in GetTime() problems
Because duration is 5 if the poly is on DR, etc.
-
ScripterQQ reacted to Matenia in GetTime() problems
I literally gave you the full solution. You have the time left, you have the full duration. From that you can do the math to get the the starting time in GetTime() value.
-
ScripterQQ reacted to Matenia in GetTime() problems
My solution still stands. GetTime() is a timestamp of sorts. It ALWAYS changes.
That's why you need to calculate the time that has already passed since the spell was applied, which is its full duration MINUS the in which it's going to end. And THAT needs to be larger than 2.
-
ScripterQQ got a reaction from massem in Player is too far from Mob.
General Settings > Enter Advanced Settings
-
ScripterQQ got a reaction from Pudge in Snippets of LUA codes (for FightClass)
Feral Druid - Auto Cat Form (instead of walking) tested on 3.3.5
Basically this forces the character to go in cat form when the bot is walking at normal speed, or dismounted for whatever reason.
If character is mounted = do nothing (the mount is faster)
if character is NOT mounted, but moving with speed lower than the cat form speed = cat form (you move faster)
1) Put this in the "Add Spell" field:
-- Cat Shapeshift CancelUnitBuff("player","Cat Form") CastSpellByName("Cat Form") 2) Conditions:
- Me in Combat: false
- Lua Script: luascript
slowed = "no" if GetUnitSpeed("player") > 0 and GetUnitSpeed("player") < 9 then slowed = "yes" end Return value research: yes
Return value var: slowed
3) Spell Setting (top right corner)
- Can move during cast: yes
- Combat only: false
- Not Spell, is lua script: true
Tested and working pretty good, it can be used for shapeshifting slowing effects, just remove the "Me in combat: false" condition. Just keep in mind that
speed 0 = char not moving
speed 7 = char normal speed (walking)
speed 9 = cat form
You can mess around and see what works better for you. For example you can do an >= 0 instead of >0, in case you want the cat form also when you are not moving (maybe you are in a nova, root, so you can shapeshift it). As it is right now, it shapeshifts the moment you start walking.
-
ScripterQQ got a reaction from 435 in new routes for battlegrounder
My profiles are/were good. Though, I got banned after 2min in battleground some months ago, using my Paladin rotation (public) and my Arathi Basin rotation (public).
So I would suggest you to create your own profile and fight class because there is a high chance that all my public stuff is detected by the warden.
-
ScripterQQ got a reaction from 435 in Announce Interrupts LUA script
Hello, I want to implement in my addon an announce that writes in party when I get interrupted in the Holy school, so I created a frame, registered event "COMBAT_LOG_EVENT_UNFILTERED" and checked for the "SPELL_INTERRUPT" firing. Works good, nothing to complain.
Problem is Penance, not only is a channeled spell, but also it belongs to "Discipline" school, which doesn't exists in the wow school database (only Holy/Nature/Shadow, etc) but I think this is not a real problem. The main problem is with Penance (didn't test with other channeled spell but I believe it's the same), in the /eventtrace, I don't see the "SPELL_INTERRUPT" firing, when kicked.
I see only something like "SPELL_FAILED" but that fires even if you stop the spell manually (for example 1 tick penance fake cast).
So how can I keep trace of the Penance (and other channeled spells) being interrupted?
I found only this and of course it has no replies or solutions: https://eu.battle.net/forums/en/wow/topic/1622868793
Thanks for reading
-
ScripterQQ reacted to Matenia in Warmane Lordaeron Bans
So they have a system that monitors user actions and it can cause false positives. This has nothing to do with injection though. Warden instructs the client to execute some Lua code or instructs the client do check a certain address in memory for its value, etc. It can its own process for modules (DLLs injected by external programs) as well.
These methods do NOT yield false positives. If they built some server side detection that can be triggered by mass crafting items, it's not warden. It's a system that observes how frequently players do some things, how much time they allow between actions, etc and then flagging accounts that seem to not behave like a human enough. A system will that is less reliable but can catch ANY bot. So now it is up to us to find out how exactly they do it and develop some code that works around this by creating pauses for wRobot, maybe slows down combat rotation, accepting/turning in quests etc.
-
ScripterQQ got a reaction from Skad in Warmane Lordaeron Bans
The fact alone a guy has been banned IN ISTANCE means it's detected, or flagged and then banned, but definitely not a safe product.
I believe it has been flagged then the gm "reads" the log and somehow see the injection in the game, and procede with ban.
They can't ban you instant like PQR because there might be a false positive, thats why it needs some time to get you banned, they need to check with their eyes the log and the injections made on the game.
As already said, I myself abused for 2 years+ straight Battlegrounder (got more than 100k HKs on different char, 24/7 spamming BGs) and not a single report on 6 character (I got good fight classes and profiles), then some weeks ago i botted for 1-2 hours radomly and got banned. A guy got banned for using WRotation, another guy for using it in Instance..too many signs that something is not right. Every person with at least 2 brain cells would understand this concept, everyone saying the opposite and defending wrobot has serious problems sorry.
-
ScripterQQ got a reaction from Jensen- in Warmane Lordaeron Bans
The fact alone a guy has been banned IN ISTANCE means it's detected, or flagged and then banned, but definitely not a safe product.
I believe it has been flagged then the gm "reads" the log and somehow see the injection in the game, and procede with ban.
They can't ban you instant like PQR because there might be a false positive, thats why it needs some time to get you banned, they need to check with their eyes the log and the injections made on the game.
As already said, I myself abused for 2 years+ straight Battlegrounder (got more than 100k HKs on different char, 24/7 spamming BGs) and not a single report on 6 character (I got good fight classes and profiles), then some weeks ago i botted for 1-2 hours radomly and got banned. A guy got banned for using WRotation, another guy for using it in Instance..too many signs that something is not right. Every person with at least 2 brain cells would understand this concept, everyone saying the opposite and defending wrobot has serious problems sorry.
-
ScripterQQ got a reaction from artur.k in Warmane Lordaeron Bans
The fact alone a guy has been banned IN ISTANCE means it's detected, or flagged and then banned, but definitely not a safe product.
I believe it has been flagged then the gm "reads" the log and somehow see the injection in the game, and procede with ban.
They can't ban you instant like PQR because there might be a false positive, thats why it needs some time to get you banned, they need to check with their eyes the log and the injections made on the game.
As already said, I myself abused for 2 years+ straight Battlegrounder (got more than 100k HKs on different char, 24/7 spamming BGs) and not a single report on 6 character (I got good fight classes and profiles), then some weeks ago i botted for 1-2 hours radomly and got banned. A guy got banned for using WRotation, another guy for using it in Instance..too many signs that something is not right. Every person with at least 2 brain cells would understand this concept, everyone saying the opposite and defending wrobot has serious problems sorry.
-
ScripterQQ got a reaction from (̾●̮̮̃̾•̃̾) ̿ ̿ ‘̿’\̵͇̿̿\ in Warmane Lordaeron Bans
By the way it's not GMs, it's an automatic ban from the warden that detects wrobot. The product isn't safe anymore and I won't use it again. Enough looses, time to stop.
-
ScripterQQ got a reaction from Tommy Cox in Snippets of LUA codes (for FightClass)
Feral Druid - Auto Cat Form (instead of walking) tested on 3.3.5
Basically this forces the character to go in cat form when the bot is walking at normal speed, or dismounted for whatever reason.
If character is mounted = do nothing (the mount is faster)
if character is NOT mounted, but moving with speed lower than the cat form speed = cat form (you move faster)
1) Put this in the "Add Spell" field:
-- Cat Shapeshift CancelUnitBuff("player","Cat Form") CastSpellByName("Cat Form") 2) Conditions:
- Me in Combat: false
- Lua Script: luascript
slowed = "no" if GetUnitSpeed("player") > 0 and GetUnitSpeed("player") < 9 then slowed = "yes" end Return value research: yes
Return value var: slowed
3) Spell Setting (top right corner)
- Can move during cast: yes
- Combat only: false
- Not Spell, is lua script: true
Tested and working pretty good, it can be used for shapeshifting slowing effects, just remove the "Me in combat: false" condition. Just keep in mind that
speed 0 = char not moving
speed 7 = char normal speed (walking)
speed 9 = cat form
You can mess around and see what works better for you. For example you can do an >= 0 instead of >0, in case you want the cat form also when you are not moving (maybe you are in a nova, root, so you can shapeshift it). As it is right now, it shapeshifts the moment you start walking.
-
ScripterQQ got a reaction from Matenia in Warmane Lordaeron Bans
Lost a Shadowmourne BiS account after few hours of Battlegrounder. Definitely detected since it's 2 years+ I abuse Battlegrounder almost 24/7 with every class and never got a single ban. All bans I "collected" were because of professions or grinding, but bg was the safest.
-
ScripterQQ reacted to Matenia in Help with plugin working 50% (easy)
wManager.Wow.Bot.Tasks.GoToTask.ToPosition(new Vector3(-5814.899, 650.6406, 94.55161));
This code is blocking - but your loop should have a Thread.Sleep anyway to keep your CPU from exploding.
I'm guessing SOMETHING interrupts your code - so add some logging to see if the above quoted code actually returns anything. It probably breaks early, so maybe try an exitCondition for the function call that's basically just if you're getting attacked.
Or do MovementManager.Go(PathFinder.FindPath(vector3)), that will never terminate unless your movement is otherwise interruped (say by fightclass, plugin, etc). On the downside, you need to add a sleep until it reaches the final destination, because it's not blocking.
Edit:
You could also calculate the path ONCE and then just walk it in your loop. Pseudo code below, I don't have a PC right now, just doing this from the top of my head.
using System; using robotManager.Products; using wManager.Plugin; using wManager.Wow.Enums; using robotManager.Helpful; using System.Threading; using wManager.Wow; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : wManager.Plugin.IPlugin { const int HONORREQUIRED = 10000; bool _running; List<Vector3> pathToFollow = new List<Vector3>(); public void Initialize() { _running = true; while (_running) { if (Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause && !Conditions.IsAttackedAndCannotIgnore && !Battleground.IsInBattleground()) { if(!pathToFollow.IsEmpty() && ObjectManager.Me.Position.DistanceTo(pathToFollow[pathToFollow.Count - 1]) > 5) { MovementManager.Go(pathToFollow); //wait until we reach last point or enter combat while(ObjectManager.Me.Position.DistanceTo(pathToFollow[pathToFollow.Count - 1]) > 5) { Thread.Sleep(500); if(Conditions.IsAttackedAndCannotIgnore || !Conditions.InGameAndConnectedAndAliveAndProductStartedNotInPause) { break; } } } var zone = Lua.LuaDoString<string>("return GetZoneText()"); var h = Lua.LuaDoString<int>("local points = GetHonorCurrency(); return points;"); if (h >= HONORREQUIRED && zone == "Stormwind City") { pathToFollow = PathFinder.FindPath(new Vector3(-5768.91, 419.931, 103.921)); wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(new Vector3(-5768.91, 419.931, 103.921), 34081); Lua.LuaDoString<int>("BuyMerchantItem(9,1)"); } // Wait Position if (h < HONORREQUIRED && zone == "Stormwind City") { pathToFollow = PathFinder.FindPath(new Vector3(-5814.899, 650.6406, 94.55161)); wManager.Wow.Bot.Tasks.GoToTask.ToPosition(new Vector3(-5814.899, 650.6406, 94.55161)); } } Thread.Sleep(500); } } public void Dispose() { _running = false; } public void Settings() { } }
-
ScripterQQ reacted to Findeh in Botter anti-botter
This is common thing, yeah. Just report him back. Constantly, like once a day.
Also for him. Prices will not go up with you reports, there are always more then you are able to report. But when you help GMs to ban bots, there is higher chance then they will come for yours next (just because there will be less tickets to delay them from doing that). The more work to do they have, the better. If there will be not much tickets they may start to patrol, just because they are bored, and when they patrol, nothing will save you, especially if your bots are the only one that left.
-
ScripterQQ reacted to Runaro in [RunMacroLua] "/click" not working
If you want to target and interact with a NPC and then also click some Buttons in the opened frame, then it's important to use sleeps between the commands.
Example in the QuestSorted:
<QuestsSorted Action="RunLuaCode" NameClass="InteractUnit("Lillith's Dinner Table")" /> <QuestsSorted Action="Wait" NameClass="1000" /> <QuestsSorted Action="RunMacroLua" NameClass="/click QuestFrameCompleteButton" /> <QuestsSorted Action="Wait" NameClass="1500" /> <QuestsSorted Action="RunMacroLua" NameClass="/click QuestFrameCompleteQuestButton" />
-
ScripterQQ reacted to Matenia in Wrotation warmane
Yes it isn't detected and neither is EWT. Pretty sure people have even modified the old PQR by now to work around Warmane's detection (which was mostly string detection, looking for PQR in chatframe)
-
ScripterQQ reacted to Avvi in Avvi's C# Tips & Tricks with Helpful Code Snippets
Hi all,
I figured I'd post some things that I have learned during my time of developing in C#. Perhaps some of this is obvious for some of the more experienced WRobot C# writers, but for me, I had to do a lot of forum searching and experimenting to make progress on any of my work.
How do I get started?
Please see this post by @Droidz
How can I see what Functions are available to me in the WRobot API?
I recommend using some sort of decompiler in order to see what functions are available in the WRobot API. That is, use something such as dotPeek from jetbrains. See this URL: https://www.jetbrains.com/decompiler/ . Once you have this downloaded, open the WRobot Binaries located in the (C:\WRobot\Bin) folder in dotPeek. I cannot even begin to explain how many times the recompiled helped me find useful things I could re-use. As a quick tip, I would suggest taking a look at the wManager.wManager.Wow.Helpers functions that are available. Anything listed as public static <variable type> will be available to use from a Plugin/Profile/Fightclass etc.
What if WRobot doesn't have an available function that I will need?
WRobot doesn't have everything instantly available, so you may need to resort to using some Lua Functions to get information back from the WoW Client. An example of this that I ran into at some point was getting the number of Character Macros someone has.. Of course this is very specific, but please bear with me for the sake of this example :).
WoW Lua Reference: http://wowprogramming.com/docs/api_categories
Using Lua in C#:
This snippet will return a List of integers and set the C# variable numberOfMacros equal to the returned list of the DoString function. To be more specific, it will provide a list of the number of Global account Macros , and the number of Personal Character Macros.
var numberOfMacros = Lua.LuaDoString<List<int>>("return numCharacterMacros");
The below will return just the number Character Macros someone has. If you need a specific variable from a Lua Function, then do the following:
var numPersonalMacros = Lua.LuaDoString<int>("local numAccountMacros, numCharacterMacros = GetNumMacros(); return numCharacterMacros"); The above snippet will set the C# variable numPersonalMacros equal to numCharacterMacros from the lua return value.
Using a Variable in the Lua.LuaDoString. The below will return the text body of the macro that has the id of 121.
var _macroID = 121 string macroBody = Lua.LuaDoString<string>("return GetMacroBody(" + _macroID + ")");
Executing Lua Code in C#
This will leave the party (if the player is in one).
wManager.Wow.Helpers.Lua.RunMacroText("/run LeaveParty()");
What is the difference between Lua.LuaDoString() and RunMacroText()?
The difference is in can be understand in how you think about them. Lua.LuaDoString should be seen as a way to retrieve information.. More specifically, the Lua.LuaDoString's purpose is to have a value returned to it, so that you can assign it to a C# Variable. RunMacroText can be used to do something in game. More specifically, RunMacroText should be used when trying to run some sort of in-game script (such as /cast spell).
Plugin Template C#: Plugin-Template.cs
I have attached a basic plugin template that can be used. In it, I have provided an example of:
A Basic Implementation of the wManager.Plugin.IPlugin Class (including Settings/Initialize/Dispose) Basic loop that will occur while WRobot is running Settings that can be configured from Plugin Page A Category/Short Description for the Plugin Settings An example of Watching for Game Events. An example of OnRunState / OnAfterRunState for WRobot States Watching For Game Events
Sometimes you may find that you need to wait for something to occur in game before you can take a specific action. In WoW / WRobot world, these things are called events. Below are two examples of events. The first event will occur when either the Group Loot Settings change, or a Player Enters/Joins the current Party.The second Event will occur when a System Message is received. I recommend adding this watchForEvents Function in the Initialize function of a plugin, or somewhere where it will only be called once. For an example of this, please see my Plugin Template.
private void watchForEvents() { EventsLuaWithArgs.OnEventsLuaWithArgs += (LuaEventsId id, List<string> args) => { if (id == wManager.Wow.Enums.LuaEventsId.PARTY_MEMBERS_CHANGED) { Logging.Write("Joined Group or something about the current group was changed."); } if (id == wManager.Wow.Enums.LuaEventsId.CHAT_MSG_SYSTEM) { Logging.Write("We Received a System Message."); } }; }
Finding the list of available Game Events:
Each version of the game is different here, so this is where you will need to be careful. By that I mean, some versions of the game may have an event type, but a different version may not. Blizzard was not always consistent in their name accross different versions of the game, so please be careful to test against multiple versions of the game.
Open DotPeek Search for "LuaEventsID" Double Click LuaEventsId in the Assembly Explorer Window. A window will open displaying a list of Events. What do each of these Events mean?
WoW Event Reference: http://wowwiki.wikia.com/wiki/Event_API
(Reminder! Some of these may be different in different versions of the game.)
Watching For WRobot State Changes
In addition to in game events, there are also WRobot 'states'. Similar to Game Events, WRobot states are the particular condition that WRobot is in at a specific time. For example, there is a state called 'MillingState', and another called 'Looting' that come out with WRobot. States are managed by the WRobot FiniteStateMachineEvents Engine. When a State occurs/changes/ends/etc, an event is passed to the FiniteStateMachine (pardon my wording here if this is not 100% correct). There are three main events that we can use to manage our States.
State Events that occur:
OnBeforeCheckIfNeedToRunState - This can be used to CANCEL an event if specific conditions are met. OnRunState - This can be used to do something just as the State is being started. OnAfterRunState - This can be used to do something just as the State has completed.
Example of OnRunState and OnAfterRunState
In this example we are watching for when WRobot starts the ToTown State and when it finishes it. We create a boolean that is set to true when the state is started, and then set it to false when the State is completed. I recommend adding the initializeToTownWatcher() function in the Initialize function of a plugin, or somewhere where it will only be called once. For example of this, please see my Plugin Template.
bool goToTown = false; private void initializeToTownWatcher() { robotManager.Events.FiniteStateMachineEvents.OnRunState += (engine, state, cancelable) => { if (state != null && state.DisplayName == "To Town") { goToTown = true; Logging.Write("Going to Town State has been initiated."); } }; robotManager.Events.FiniteStateMachineEvents.OnAfterRunState += (engine, state) => { if (state != null && state.DisplayName == "To Town") { goToTown = false; Logging.Write("We have completed going To Town State."); } }; } Example of OnBeforeCheckIfNeedToRunState
In this example, we catch the state with the name of To Town and cancel it by setting the passed in cancelable parameter to true.
private void cancelToTownState() { robotManager.Events.FiniteStateMachineEvents.OnBeforeCheckIfNeedToRunState += (engine, state, cancelable) => { if (state != null && state.DisplayName == "To Town") { Logging.Write("We have cancelled the To Town State"); cancelable.Cancel = true; } }; } Where can I find other WRobot States?
Each version of the WRobot is different, so some versions of WRobot may have a state type, but a different version may not. Please be careful to test against multiple versions of the game/WRobot.
Open DotPeek Expand wManager Module Expand wManager.Wow.Bot.States namespace.
MORE TBA....
The above is my attempt at trying to help newcomers to WRobot at writing their own plugins / fight classes / etc. If there are any questions , suggestions, or even corrections, please do let me know in the comments and I'll be sure to add/update things as they come up!
Thanks,
- Avvi
-
ScripterQQ reacted to skeletonboy360 in Interface action failed because of an addon
Lua.LuaDoString(“ReloadUI();”); ?
-
ScripterQQ got a reaction from Garub in WSG Profile
Nah u just go in Battleground mode, scroll down there should be a button Create Profile and u start recordin, then u save the file as WSG.xml (ally or horde)
-
ScripterQQ reacted to Droidz in Go To Trainers command (for all classes)
Hello, I keep note, I'll add c# code to force to go to the trainer (and probably button tab tools also)
-
ScripterQQ reacted to Droidz in Very simple question for C# users
Hello, in C# when you use float type you need to end by "f" (when use have decimal number), but not when you use double type (but result is the same)