Spell_Routines.inc v3.0 for IS with spellrecasttimes

Moderator: MacroQuest Developers

bardomatic
a ghoul
a ghoul
Posts: 131
Joined: Thu Apr 29, 2004 12:09 am

Spell_Routines.inc v3.0 for IS with spellrecasttimes

Post by bardomatic » Tue Aug 22, 2006 9:07 pm

Spell_Routines.inc

Code: Select all

; fixed a few problems 9-5-6
; Spell_Routines.inc 3.0.1
; fixed timers for recasts, 
; spell_routines.inc 2.5.0
; Originally Written by Rusty~
; Much code and logic stolen from A_Druid_00
; Translated for ISXEQ by echoism
; Requires ISXEQExchange for item swap
; spell_routines.inc 2.5
; Fixed by iluvseq
; Modified for ISXEQ by echoism
; Originally Written by Rusty~
; Much logic and code stolen from A_Druid_00
; Requires IXSEQExchange for item swap
; Also includes FD fix that would cause an endless loop if you were hit by FD mid-cast (originally by A_Druid_00)
; Features:
; - Casts spells, clicks items, or uses AA abilities for you
; - Allows back to back casting without waiting on spell gems to pop all the way up
; - Will interrupt spell if target dies while casting. If on a mount, it will dismount and duck if the time left
;	is greater than 7 seconds, else it will move forward a bit to interrupt, then move you back
;	IMPORTANT: if you don't want to interrupt a spell while mounted, put this at the top of your script:
;	variable int noInterrupt=
; - Allows you to use items in bags. Equips item, clicks it, then returns it to its previous location
; - Lets you set how long you want to keep trying to cast the spell (defaults to 0)
;	If the spell is interrupted before the given time, it will recast, else it will return CAST_INTERRUPTED
; - Lets you call a custom subroutine while waiting for spell to finish casting
;	Try to keep custom functions very small. A common use would be to interrupt the spell if a certain condition is true
; - This file also includes a function named Interrupt. You can call this to interrupt any spell you're casting instantly.
; - You can also use the SwapItem sub included in this to swap items to certain slots
; - Added EquipItem sub to easily equip items in your main Inventory slots.
; - Note: if you don't want this to cast spells while you're invis, in your main function have this at the top:
;	variable int noInvis=1
; - This will make it return CAST_INVIS if you're invis
;	Below is a list of variables you can access in your script:
;		refreshTime		- How much time is left till you're done recovering from casting
;		castEndTime		- How much time left till you're done casting the current spell... usable in custom spell Subs
;		spellNotHold		- 1 if your last spell didn't take hold, 0 otherwise
;		spellRecastTime1..9 	- How much time left till that spell is back up
;======================================================================================================================
; EquipItem: An easier way to equip items you have in bags ( useful for weapons or focus items )
;	slot name is optional. If not given, it will equip it in the first possible spot
; Usage:
;	call EquipItem "item name|slotname"
; Returns: "old item name|slotname"
; Examples:
;	To Equip Sharp Ended Broken Lever when you have Serpent of Vindication equiped:
;		call EquipItem "Sharp Ended Broken Lever"
;	It will return "Staff of Vindication|mainhand"
;	To reequip the original item, you can save the return in a variable, and then use it later like this:
;		oldPrimary:Set[${Return}]
;		... do stuff here with your new item equiped
;		call EquipItem ${oldPrimary}
;======================================================================================================================
; SwapItem: a subroutine which is used in the Cast function itself. You don't need to do this to cast an item in a bag
;	but you can call it in your script to swap items (such as weapons or focus items)
; Usage:
;	call SwapItem "item name" slotname
; Examples:
;	To swap Darkblade of the Warlord to your main hand:
;		call SwapItem "Darkblade of the Warlord" mainhand
;	To swap stat food in one bag with other food in another bag:
;		call SwapItem "Bristlebanes Party Platter" ${FindItem[halas 10lb meat pie].InvSlot}
;======================================================================================================================
; Cast: the main function that casts spells or items for you
; Usage:
;	call Cast "spellname|itemname|AAname|AA#" [item|alt|gem#] [give up time][m|s] [custom subroutine name] [Number of resist recasts]
; Examples:
; 	To cast Howl of Tashan and mem it in slot 3 if not memmed:
;		call Cast "Howl of Tashan" gem3
;	To cast Arcane Rune and keep trying for 7 seconds, in case of interrupts.
;		call Cast "Arcane Rune" gem5 7s
;	To click Grim Aura earring that's in a bag:
;		call Cast "Shrunken Goblin Skull Earring" item
;	To use AA ability Eldritch Rune:
;		call Cast "Eldritch Rune" alt
;		or
;		call Cast "173" alt
;	To call a subroutine that interrupts CH if target gets healed before it lands:
;		call Cast "Complete Healing" gem1 0 CheckHP
;	Then in your script have somewhere:
;	function CheckHP()
;	{
;		if ${Target.PctHPs}>=80
;		call Interrupt
;	}
; Returns these values:
;-----------------------+-----------------------------------------------------------------------+
; CAST_CANCELLED	| Spell was cancelled by ducking (either manually or because mob died)	|
; CAST_CANNOTSEE	| You can't see your target						|
; CAST_IMMUNE		| Target is immune to this spell					|
; CAST_INTERRUPTED	| Casting was interrupted and exceeded the given time limit		|
; CAST_INVIS		| You were invis, and noInvis is set to true				|
; CAST_NOTARGET		| You don't have a target selected for this spell			|
; CAST_NOTMEMMED	| Spell is not memmed and you gem to mem was not specified		|
; CAST_NOTREADY		| AA ability or spell is not ready yet					|
; CAST_OUTOFMANA	| You don't have enough mana for this spell!				|
; CAST_OUTOFRANGE	| Target is out of range						|
; CAST_RESISTED		| Your spell was resisted!						|
; CAST_SUCCESS		| Your spell was cast successfully! (yay)				|
; CAST_UNKNOWNSPELL	| Spell/Item/Ability was not found					|
;-----------------------+-----------------------------------------------------------------------+
 
 
#define _SPELL_ROUTINES_ 2.5.0
 
#macro pausecheck(a)
	if (a>0.1 && !${Me.Spawn.Class.Name.Equal[Bard]})
	{
			if (${Stick.Status.Equal[ON]})
				Stick pause
			if (${FollowFlag})
				call PauseFunction
			if (${Me.Moving})
				Keypress back
	}
#endmac
 
#macro sr_ProcessQueue()
if ${QueuedCommands}
	while ${QueuedCommands}
			ExecuteQueued
#endmac

objectdef rscripttimer
{
	variable bool StopWatch=FALSE 
	variable uint EndTime
	method Set(string settime)
	{
		variable string temptime
		if ${settime.Left[1].Equal[-]}
		{
			StopWatch:Set[TRUE]
			EndTime:Set[${Script.RunningTime}] 
			return
		}
		if ${settime.Find[:]}
			switch ${settime.Count[:]}
			{
				case 2
					temptime:Set[${Math.Calc[${settime.Token[1,:]}*3600 + ${settime.Token[2,:]}*60 + ${settime.Token[3,:]}].Int}000]
					break
				case 1 
					temptime:Set[${Math.Calc[${settime.Token[1,:]}*60 + ${settime.Token[2,:]}].Int}000]
					break
				default
					temptime:Set[0]
			}
		else
			switch ${settime.Right[1]}
			{
				case s
					temptime:Set[${settime.Left[${Math.Calc[${settime.Length}-1]}]}000]
					break
				case m
					temptime:Set[${Math.Calc[${settime.Left[${Math.Calc[${settime.Length}-1]}]}*60].Int}000]
					break
				case 0
				case 1
				case 2
				case 3
				case 4
				case 5
				case 6
				case 7
				case 8
				case 9
					temptime:Set[${settime}00]
					break
				default
					temptime:Set[0]
			
			}
		StopWatch:Set[FALSE]
		EndTime:Set[${temptime}+${Script.RunningTime}] 
	} 
	member:uint TimeLeft()
	{ 
		if ${Script.RunningTime}>=${EndTime}
			if ${StopWatch}
				return ${Math.Calc[${Script.RunningTime}-${EndTime}]} 

			else
				return 0 
		return ${Math.Calc[${EndTime}-${Script.RunningTime}]} 
	}
	member:uint ToText()
	{ 
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
				return ${Math.Calc[(${Script.RunningTime}-${EndTime})/100].Int} 

			else
				return 0 
		return ${Math.Calc[(${EndTime}-${Script.RunningTime})/100].Int} 
	}
	member:uint TotalSeconds()
	{
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
				return ${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)].Int}

			else
				return 0 
		return ${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)].Int}
	}
	member:uint Hours()
	{
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
				return ${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)/3600].Int}

			else
				return 0 
		return ${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)/3600].Int}
	}
	member:uint Minutes()
	{
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
				return ${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)/60%60].Int}

			else
				return 0 
		return ${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)/60%60].Int}
	}
	member:uint Seconds()
	{
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
				return ${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)%60].Int}

			else
				return 0 
		return ${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)%60].Int}
	}
	member:string HMS()
	{
		variable int h=${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)/3600].Int}
		variable int m=${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)/60%60].Int}
		variable int s=${Math.Calc[((${EndTime}-${Script.RunningTime})/1000)%60].Int}
		if ${Script.RunningTime}>=${EndTime} 
			if ${StopWatch}
			{
				h:Set[${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)/3600].Int}]
				m:Set[${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)/60%60].Int}]
				s:Set[${Math.Calc[((${Script.RunningTime}-${EndTime})/1000)%60].Int}]
				return "${If[${h}>0,${h}:,]}${If[${m}>9,${m},0${m}]}:${If[${s}>9,${s},0${s}]}"
			}
			else
				return ""
		return "${If[${h}>0,${h}:,]}${If[${m}>9,${m},0${m}]}:${If[${s}>9,${s},0${s}]}"
	}
}
variable int ResistCounter
variable bool moveBack=FALSE
variable int selfResist=0
variable string selfResistSpell
variable rscripttimer giveUpTimer
variable rscripttimer castEndTime
variable rscripttimer refreshTime
variable float itemRefreshTime
variable int spellNotHold=0
variable int noInterrupt=0
variable rscripttimer spellRecastTime1
variable rscripttimer spellRecastTime2
variable rscripttimer spellRecastTime3
variable rscripttimer spellRecastTime4
variable rscripttimer spellRecastTime5
variable rscripttimer spellRecastTime6
variable rscripttimer spellRecastTime7
variable rscripttimer spellRecastTime8
variable rscripttimer spellRecastTime9
variable bool init=TRUE
variable string castReturn="CAST_CANCELLED"
 
variable int barddelay=32
 
function Cast(string spellName, string spellType, int giveUpValue, string mySub, int ResistTotal)
{
	if !${spellType.Length}
		spellType:Set[spell]

	ext -require ISXEQ
	if "!${Script[exchange](exists)}"
		ext -require ISXEQExchange
 
	variable int i=0
	variable int spellID

	if ${Me.Spawn.Invis} && ${noInvis}
		return CAST_INVIS
 
	if ${init}
	{
		call cast_add_triggers
		for (i:Set[1] ; ${i}<=9 ; i:Inc)
		{
			if ${Me.SpellReady[${i}]}
				spellRecastTime${i}:Set[0]
			else
				spellRecastTime${i}:Set[10*${Me.Gem[${i}].RecastTime}]
		}
	}
 
	giveUpTimer:Set[${giveUpValue}*10]
	ResistCounter:Set[${ResistTotal}]
	spellNotHold:Set[0]
	selfResist:Set[0]
 
	while (${Me.Casting.ID(exists)} || (${Me.Moving} && ${castTime}>0.1))
		if ${mySub.Length} && ${mySub.NotEqual[NULL]}
			call "${mySub}" "${spellID}"
 
	if (${Window[SpellBookWnd].Open})
		Keypress spellbook

	castReturn:Set[X]
	Switch ${spellType}
	{
		case item
			if !${FindItem[${spellName}].InvSlot}
				return CAST_UNKNOWNSPELL
			pausecheck(${FindItem[${spellName}].CastTime})
			call ItemCast "${spellName}" "${mySub}"
			break
		case alt
			if !${Me.AltAbility[${spellName}].ID}
				return CAST_UNKNOWNSPELL
			pausecheck(${Me.AltAbility[${spellName}].Spell.MyCastTime})
			call AltCast "${spellName}" "${mySub}"
			break
		default
			if !${Me.Book[${spellName}](exists)}
				return CAST_UNKNOWNSPELL
			spellID:Set[${Me.Book[${Me.Book[${spellName}]}].ID}]
			if ${Me.CurrentMana}<${Spell[${spellID}].Mana}
				return CAST_OUTOFMANA
			pausecheck(${Spell[${spellName}].MyCastTime})
			call SpellCast "${spellType}" "${spellName}" "${spellID}" "${mySub}" "${giveUpValue}"
	}
	if (${Stick.Status.Equal[PAUSED]})
			Stick unpause
	if (${PauseFlag})
			call PauseFunction
	giveUpTimer:Set[0]
	ResistCounter:Set[0]
	WaitFrame
		return ${castReturn}
}
 
function SpellCast(string spellType, string spellName, int spellID, string mySub, int giveUpValue)
{
	variable rscripttimer recoverWaitTime=30
	variable bool retrySpell=FALSE

;	echo SpellCast() debug - spellName = ${spellName}

	if !${Me.Gem[${spellName}]}
	{
		if ${Cursor.ID}
			call ClearCursor
		if ${spellType.Left[3].Equal[gem]}
			memspell ${spellType.Right[1]} "${spellName}"
		else
			return CAST_NOTMEMMED
	}
 	if ${mySub.Length} && ${mySub.NotEqual[NULL]}
		call ${mySub} ${spellID}
	Wait 90 ${Me.Gem[${spellName}]}
	if (${Me.Gem[${spellName}]})
		spellRecastTime${Me.Gem[${spellName}]}:Set[10*${Spell[${spellID}].RecastTime}]
	else
		return CAST_INTERRUPTED
	while (!${Me.SpellReady[${spellName}]})
	{
		if ${mySub.Length} && ${mySub.NotEqual[NULL]}
			call ${mySub} ${spellID}
		Wait 150 ${Me.SpellReady[${spellName}]}
		if (!${giveUpTimer} && !${Me.SpellReady[${spellName}]})
			return CAST_NOTREADY
	}
	if ${spellName.Find[illusion: ]} && ${Me.AltAbilityReady[project illusion]}
		call Cast "project illusion" alt

	giveUpTimer:Set[${giveUpValue}*10]

	do
	{
		if (!${Me.SpellReady[${spellName}]} && (${spellRecastTime${Me.Gem[${spellName}]}}<${giveUpTimer} || ${refreshTime}>0 || ${castReturn.Equal[CAST_RESISTED]}))
		{
			if ${mySub.Length} && ${mySub.NotEqual[NULL]}
				call ${mySub} ${spellID}
			continue
		}
		else
		{
			if (!${Me.SpellReady[${spellName}]} && !${castReturn.Equal[CAST_RESISTED]})
				return CAST_NOTREADY
		}
		waitframe
		Me:Stand
		CastSpell "${spellName}"
		if ${Me.Class.ShortName.Equal[BRD]}
			timedcommand ${barddelay} EQExecute /stopsong
		Wait 10 ${QueuedCommands}
			sr_ProcessQueue()
		if (${Me.Spawn.Casting.ID})
		{
			spellID:Set[${Me.Spawn.Casting.ID}]
			castEndTime:Set[${Me.Spawn.Casting.MyCastTime}*10]
			if (${castEndTime}<${Math.Calc[${Me.Spawn.Casting.CastTime}*5]})
				castEndTime:Set[${Me.Spawn.Casting.CastTime}*5]
		}
		moveBack:Set[FALSE]
		if ${mySub.Length} && ${mySub.NotEqual[NULL]}
			call WaitCast ${mySub} ${spellID}
		else
			call WaitCast
		if (${moveBack})
		{
			Keypress back hold
			Wait 4
			Keypress back
			Wait 15 !${Me.Moving}
		}
		sr_ProcessQueue()
		retrySpell:Set[TRUE]
		Switch ${castReturn}
		{
			case CAST_CANCELLED
				return CAST_CANCELLED
			case CAST_RECOVER
				castReturn:Set[CAST_NOTREADY]
				if !${recoverWaitTime}
				{
					spellRecastTime${Me.Gem[${spellName}]}:Set[10*${Spell[${spellID}].RecastTime}]
					if !${giveUpTimer}
						return CAST_NOTREADY
				}
				break
			case CAST_RESTART
			case CAST_INTERRUPTED
				if !${giveUpTimer}
					return CAST_INTERRUPTED
				break
			case CAST_RESISTED
				if !${ResistCounter}
					return CAST_RESISTED
				break
			case CAST_STUNNED
			case CAST_FIZZLE
			case CAST_COLLAPSE
				break
			case CAST_SUCCESS
			default
				retrySpell:Set[FALSE]
		}
	}
	while ${retrySpell}
	{
		if (!${castReturn.Equal[CAST_CANNOTSEE]} && !${castReturn.Equal[CAST_OUTOFRANGE]} && !${castReturn.Equal[CAST_OUTOFMANA]} && !${castReturn.Equal[CAST_NOTARGET]} && !${castReturn.Equal[CAST_INTERRUPTED]})
		{
			refreshTime:Set[10*${Spell[${spellID}].RecoveryTime}]
			spellRecastTime${Me.Gem[${spellName}]}:Set[10*${Spell[${spellID}].RecastTime}]
		}
	}
}
 
function ItemCast(string spellName,string mySub)
{
	variable int charges
	variable string oldItemName
	variable string slotName
	variable bool swapItemBack=FALSE
	variable bool retrySpell

	do
	{
		if (${FindItem[${spellName}].InvSlot}>21)
		{
			swapItemBack:Set[TRUE]
			if (${FindItem[${spellName}].WornSlot[1]} && ${FindItem[${spellName}].EffectType.Find[worn]})
				slotName:Set[${FindItem[${spellName}].WornSlot[1].Name}]
			elseif (${FindItem[${spellName}].InvSlot}>29)
				slotName:Set[pack8]
			else
				slotName:Set[${FindItem[${spellName}].InvSlot.Name}]
			oldItemName:Set[${InvSlot[${slotName}].Item.Name}]
			call SwapItem "${spellName}" ${slotName}
		}
		while (${itemRefreshTime}>${MacroQuest.Running})
			WaitFrame
		itemRefreshTime:Set[${Math.Calc[${MacroQuest.Running}+000]}]
		charges:Set[${FindItem[${spellName}].Charges}]
		Me:Stand
		waitframe
		CastSpell item "${spellName}"
		Wait 10 ${QueuedCommands}
		sr_ProcessQueue()
		if (${Me.Spawn.Casting.ID})
			castEndTime:Set[${FindItem[${spellName}].CastTime}*10]
		if (${charges})
			Wait 10 ${FindItem[${spellName}].Charges}!=${charges}
		call WaitCast ${mySub}
		if (${swapItemBack} && ${FindItem[${oldItemName}].ID})
			call SwapItem "${oldItemName}" ${slotName}
		retrySpell:Set[TRUE]
		sr_ProcessQueue()
		Switch ${castReturn}
		{
			case CAST_CANCELLED
				return CAST_CANCELLED
			case CAST_NOTREADY
			case CAST_RECOVER
				castReturn:Set[CAST_NOTREADY]
				if !${giveUpTimer}
					return CAST_NOTREADY
				break
			case CAST_RESTART
			case CAST_INTERRUPTED
				castReturn:Set[CAST_INTERRUPTED]
				if !${giveUpTimer}
					return CAST_INTERRUPTED
				break
			case CAST_RESISTED
				if !${ResistCounter}
					return CAST_RESISTED
				break
			case CAST_STUNNED
			case CAST_COLLAPSE
				break
			case CAST_SUCCESS
			default
				retrySpell:Set[FALSE]
		}
	}
	while ${retrySpell}
}
 
function AltCast(string spellName,string mySub)
{
	variable bool retrySpell
	Me:Stand
	waitframe
	do
	{
		EQExecute /alt activate ${Me.AltAbility[${spellName}].ID}
		if ${Me.Spawn.Casting.ID}
			castEndTime:Set[${Me.AltAbility[${spellName}].Spell.MyCastTime}*10]
		Wait 10 ${QueuedCommands}
		sr_ProcessQueue()
		call WaitCast ${mySub}
		sr_ProcessQueue()
		retrySpell:Set[TRUE]
		Switch ${castReturn}
		{
			case CAST_CANCELLED
				return CAST_CANCELLED
			case CAST_NOTREADY
			case CAST_RECOVER
				castReturn:Set[NOTREADY]
				if !${giveUpTimer}
					return CAST_NOTREADY
				break
			case CAST_RESTART
			case CAST_INTERRUPTED
				if !${giveUpTimer}
					return CAST_INTERRUPTED
				break
			case CAST_RESISTED
				if !${ResistCounter}
					return CAST_RESISTED
				break
			case CAST_STUNNED
			case CAST_COLLAPSE
				break
			case CAST_SUCCESS
			default
				retrySpell:Set[FALSE]
		}
	}
	while ${retrySpell}
}
 
function ClearCursor()
{
	variable int i=0
	while (${Cursor.ID})
	{
		if (${Cursor.Container})
			while (${i:Inc}<=8)
				if (!${InvSlot[pack${i}].Item.Container})
				NoModKey itemnotify pack${i} leftmouseup
			else
				EQExecute /autoinventory
	}
}
 
function EquipItem(WhatWhere)
{
	variable string DestName
	variable string ItemName=${WhatWhere.Token[1,|]}
	variable string SlotName=${WhatWhere.Token[2,|]}
	if (${SlotName.Equal[NULL]})
		SlotName:Set[${InvSlot[${FindItem[=${ItemName}].WornSlot[1]}].Name}]
	if (${FindItem[=${ItemName}].InvSlot}<22 || !${FindItem[=${ItemName}].WornSlot[${SlotName}]})
		return
	if (!${InvSlot[${SlotName}].Item.Name.Equal[NULL]})
		DestName:Set["${InvSlot[${SlotName}].Item.Name}|${SlotName}"]
	call SwapItem "${ItemName}" "${SlotName}"
	return ${DestName}
}
 
function Interrupt()
{
	;; TODO remove the dismount?
	if (${Me.Spawn.Mount.ID})
		EQExecute /dismount
	EQExecute /stopcast
	while ${Me.Spawn.Casting.ID}
		WaitFrame
	castReturn:Set[CAST_CANCELLED]
	return ${castReturn}
}
 
function SwapItem(string itemName,string slotName)
{
	if (${Cursor.ID})
		call ClearCursor
	exchange "${itemName}" ${slotName}
	Wait 50 ${InvSlot[${slotName}].Item.Name.Equal[${itemName}]}
	if (${Cursor.ID})
		call ClearCursor
	return
}
 
function WaitCast(string mySub,int spellID)
{
	variable int currentTarget=${Target.ID}
	variable string currentTargetType=${Target.Type}
	do
	{
		if ${mySub.Length} && ${mySub.NotEqual[NULL]}
			call ${mySub} ${spellID}
		if (${Me.Spawn.Casting.ID})
		{
			if (${currentTarget} && !${Spawn[${currentTarget}].Type.Equal[${currentTargetType}]})
			{
				if (!${Me.Spawn.Casting.TargetType.Equal[PB AE]} && !${Me.Spawn.Casting.TargetType.Equal[self]} && !${moveBack} && (!${Me.Mount.ID} || !${noInterrupt}))
				{
					if (!${Me.Mount.ID} || ${castEndTime}>70)
					{
						call Interrupt
					}
					elseif (${Me.Spawn.Casting.RecastTime}>3)
					{
						castReturn:Set[CAST_CANCELLED]
						EQExecute /stopcast
						moveBack:Set[true]
					}
				}
			}
			if (${Me.Spawn.State.Equal[DUCK]})
				castReturn:Set[CAST_CANCELLED]
		}
	}
	while (${Me.Spawn.Casting.ID})
}
 
function cast_add_triggers()
{
	AddTrigger cast_begin "You begin casting @SPELL@."
	AddTrigger cast_collapse "Your gate is too unstable, and collapses."
	AddTrigger cast_fdfail "@PERSON@ has fallen to the ground."
	AddTrigger cast_fizzle "Your spell fizzles!"
	AddTrigger cast_immune "Your target is immune to changes in its @WHAT@ speed."
	AddTrigger cast_immune "Your target cannot be mesmerized@rest@"
	AddTrigger cast_interrupt "Your casting has been interrupted!"
	AddTrigger cast_interrupt "Your spell is interrupted."
	AddTrigger cast_interrupt "Aborting memorization of spell."
	AddTrigger cast_nohold "Your spell did not take hold."
	AddTrigger cast_nohold "Your spell would not have taken hold."
	AddTrigger cast_nohold "You must first target a group member@REST@"
	AddTrigger cast_nohold "Your spell is too powerful for your intended target@REST@"
	AddTrigger cast_nohold "This spell only works on @REST@"
	AddTrigger cast_nolos "You cannot see your target."
	AddTrigger cast_notarget "You must first select a target for this spell!"
	AddTrigger cast_notready "Spell recast time not yet met."
	AddTrigger cast_notready "You can use the ability @ALT@ again in @MIN@ minute(s) @SEC@ seconds."
	AddTrigger cast_outofmana "Insufficient Mana to cast this spell!"
	AddTrigger cast_outofrange "Your target is out of range, get closer!"
	AddTrigger cast_recover "You haven't recovered yet..."
	AddTrigger cast_recover "Spell recovery time not yet met."
	AddTrigger cast_resisted "Your target resisted the @NAME@ spell."
	AddTrigger cast_resisted2 "You resist the @NAME@ spell."	
	AddTrigger cast_standing "You must be standing to cast a spell."
	AddTrigger cast_stunned "You are stunned!"
	AddTrigger cast_stunned "You cannot cast spells while stunned!"
	AddTrigger cast_stunned "You *CANNOT* cast spells, you have been silenced!"
}
 
function cast_remove_triggers()
{
	RemoveTrigger cast_begin
	RemoveTrigger cast_collapse
	RemoveTrigger cast_fdfail
	RemoveTrigger cast_fizzle
	RemoveTrigger cast_immune
	RemoveTrigger cast_interrupted
	RemoveTrigger cast_nohold
	RemoveTrigger cast_nolos
	RemoveTrigger cast_notarget
	RemoveTrigger cast_notready
	RemoveTrigger cast_outofmana
	RemoveTrigger cast_outofrange
	RemoveTrigger cast_recover
	RemoveTrigger cast_resisted
	RemoveTrigger cast_resisted2
	RemoveTrigger cast_standing
	RemoveTrigger cast_stunned
}
 
function cast_begin()
{
	castReturn:Set[CAST_SUCCESS]
}
 
function cast_collapse()
{
	castReturn:Set[CAST_COLLAPSE]
}
 
function cast_fdfail(line,name)
{
	if ${name.Equal[${Me.Name}]}
	{
		if !${Me.Spawn.State.Equal[STAND]}
			Me:Stand
		castReturn:Set[CAST_RESTART]
	}
}
 
function cast_fizzle()
{
	castReturn:Set[CAST_FIZZLE]
}
 
function cast_immune()
{
	castReturn:Set[CAST_IMMUNE]
}
 
function cast_interrupt()
{
	if !${castReturn.Equal[CAST_CANCELLED]}
		castReturn:Set[CAST_INTERRUPTED]
}
 
function cast_nohold()
{
	spellNotHold:Set[1]
	castReturn:Set[CAST_IMMUNE]
}
 
function cast_nolos()
{
	castReturn:Set[CAST_CANNOTSEE]
}
 
function cast_notarget()
{
	castReturn:Set[CAST_NOTARGET]
}
 
function cast_notready()
{
	castReturn:Set[CAST_NOTREADY]
}
 
function cast_outofmana()
{
	castReturn:Set[CAST_OUTOFMANA]
}
 
function cast_outofrange()
{
	castReturn:Set[CAST_OUTOFRANGE]
}
 
function cast_recover()
{
	castReturn:Set[CAST_RECOVER]
}
 
function cast_resisted(line,name)
{
	if (${selfResist} && ${name.Equal[${selfResistSpell}]})
		selfResist:Set[0]
	if (${ResistCounter})
		ResistCounter:Dec
	castReturn:Set[CAST_RESISTED]
}
 
function cast_resisted1(line,name)
{
	selfResist:Set[1]
	selfResistSpell:Set[${name}]
}
 
function cast_standing()
{
	Me:Stand
	castReturn:Set[CAST_RESTART]
}
 
function cast_stunned()
{
	if (${Me.Stunned})
		Wait 30 !${Me.Stunned}
	else
		Wait 7
	castReturn:Set[CAST_STUNNED]
}
Last edited by bardomatic on Fri Sep 08, 2006 8:28 pm, edited 1 time in total.

bardomatic
a ghoul
a ghoul
Posts: 131
Joined: Thu Apr 29, 2004 12:09 am

Post by bardomatic » Wed Sep 06, 2006 12:52 am

updates timers, fixed a few bugs

bardomatic
a ghoul
a ghoul
Posts: 131
Joined: Thu Apr 29, 2004 12:09 am

Post by bardomatic » Fri Sep 08, 2006 8:30 pm

fixed the broken stuff from last fix




SOE

spanners
a lesser mummy
a lesser mummy
Posts: 56
Joined: Wed Jul 04, 2007 3:02 pm

Post by spanners » Sun Sep 07, 2008 1:45 am

Diff to enable the following:

1) 10 spell gems
2) short circuit for spells that aren't ready or not memed so you don't wait

For 1) you need the updates for MemSpell and CastSpell commands in ISXEQ
See post: http://macroquest2.com/phpBB2/viewtopic ... 961#136961

For 2), if you specify a wait time of 0; if the gem is not ready, you will immediately return, if the spell is not loaded in any gems you will not try to mem it

e.g. call Cast "some spell" gem10 0 will not wait at all if the gem is empty, nor will it mem the spell

Code: Select all

--- spell_routines_orig.inc     2008-09-07 00:32:06.000000000 -0500
+++ spell_routines_new.inc      2008-09-07 00:44:08.000000000 -0500
@@ -1,3 +1,7 @@
+; Spell_Routines.inc 3.0.2
+; enabled spell gem 10, allow short circuit with a wait time of 0.
+; The spell will not be memmed nor will you wait to cast it.
+; The purpose of this is to only use the spell if its loaded and ready right now
 ; fixed a few problems 9-5-6
 ; Spell_Routines.inc 3.0.1
 ; fixed timers for recasts,
@@ -271,6 +275,7 @@
 variable rscripttimer spellRecastTime7
 variable rscripttimer spellRecastTime8
 variable rscripttimer spellRecastTime9
+variable rscripttimer spellRecastTime10
 variable bool init=TRUE
 variable string castReturn="CAST_CANCELLED"

@@ -294,7 +299,7 @@
    if ${init}
    {
       call cast_add_triggers
-      for (i:Set[1] ; ${i}<=9 ; i:Inc)
+      for (i:Set[1] ; ${i}<=10 ; i:Inc)
       {
          if ${Me.SpellReady[${i}]}
             spellRecastTime${i}:Set[0]
@@ -321,18 +326,30 @@
       case item
          if !${FindItem[${spellName}].InvSlot}
             return CAST_UNKNOWNSPELL
+
+        if (!(${FindItem[${spellName}].Timer} == 0) && (${giveUpValue} == 0))
+             return CAST_NOTREADY
+
          pausecheck(${FindItem[${spellName}].CastTime})
          call ItemCast "${spellName}" "${mySub}"
          break
       case alt
          if !${Me.AltAbility[${spellName}].ID}
             return CAST_UNKNOWNSPELL
+
+        if (!${Me.AltAbilityReady[${spellName}]} && (${giveUpValue} == 0))
+             return CAST_NOTREADY
+
          pausecheck(${Me.AltAbility[${spellName}].Spell.MyCastTime})
          call AltCast "${spellName}" "${mySub}"
          break
       default
          if !${Me.Book[${spellName}](exists)}
             return CAST_UNKNOWNSPELL
+
+         if (!${Me.SpellReady[${spellName}]} && (${giveUpValue} == 0))
+             return CAST_NOTREADY
+
          spellID:Set[${Me.Book[${Me.Book[${spellName}]}].ID}]
          if ${Me.CurrentMana}<${Spell[${spellID}].Mana}
             return CAST_OUTOFMANA
@@ -361,7 +378,17 @@
       if ${Cursor.ID}
          call ClearCursor
       if ${spellType.Left[3].Equal[gem]}
+      {
+        if (${spellType.Length}==4)
+        {
          memspell ${spellType.Right[1]} "${spellName}"
+        }
+
+        if (${spellType.Length}==5)
+        {
+           memspell ${spellType.Right[2]} "${spellName}"
+        }
+      }
       else
          return CAST_NOTMEMMED
    }
spanners

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

New News For Deciding On Crypto Trading

Post by FrankJScott » Wed Mar 08, 2023 6:29 am

In reply to the person talking about best crypto day trading platform, automated trading machine, crypto coin trading, forex cryptocurrency, crypto margin trading exchanges, best free stock chat rooms, I highly suggest this look what i found about automated trading forum or cryptocurrency buy and sell app, free stock market chat room, etoro leverage crypto, etrade crypto trading, best crypto exchange reddit, staking on etoro, as well as this for beginners on crypto trading info as well as automated option trading software, automated trading sites, best crypto copy trading platform, auto software for share market, tradingview bot, auto trading on binance, and don't forget this had me going on crypto trading info which is as good as automate your trading strategy, primexbt bonus, auto trading in binance, best crypto traders, easylanguage forum, international trader forum 2021, . Also, have a look at this over at this website for forex trading details as well as esignal forums, best automated forex trading bot, automated ichimoku trading robot, mt4 ea forum, xt exchange reddit, auto trading system software, not to mention this related site about forex trading url and don't forget automated trading software interactive brokers, best crypto trading, huobi bot trading, best quadency bot, roostoo, best crypto exchange in the world, not to mention extra resources about forex trading advice which is also worth a look alongside all binance auto sell and buy, degiro automated trading, the best ea forex, tastyworks automated trading, bitfinex margin, top 10 auto trading software, also. I also suggest this look at this on crypto trading tips not to mention forex auto trading bot, tws automated trading, bulletin board trading, coinrule app, phemex leverage, robinhood crypto outage, as well as this a total noob for crypto trading advice not to mention crypto trading tips reddit, best day trading bot, best automated stock trading platform, forex trading forums beginners, best forex robots mt4, altcoin trader app, and don't forget recommended site for automated trading link as well as stock and crypto trading, crypto arbitrage reddit, automation in stock market, thinkorswim forum, best crypto to swing trade, crypto trading platform, which is also great. Finally, have a look at this continue reading on crypto trading forum with swing trading crypto, etoro leverage crypto, top crypto exchanges, buying crypto on webull, best cryptocurrency investment app, broker forex forum, for good measure. Check more @ Free Reasons For Choosing Microsoft Programs e3c8dec

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Handy Reasons On Considering Selling Your Car

Post by FrankJScott » Tue Mar 14, 2023 7:51 am

To the guy inquiring about sell your car online for free, websites to sell my car, best place to buy old cars, sell your bmw, sell non running car online, cheap repossessed cars for sale, used audi q5 for sale near me, used hondas for sale near me, junk yards that sell cars, i need to junk my car for cash, ford ecosport used for sale, I highly recommend this straight from the source for car selling info on top of the best way to sell a car online, sell my car direct, sell bmw parts online, sell used car for cash near me, sold my vehicle, leasing cars for sale, sell my junk car fast, ford eco sports for sale, quick online car valuation, nissan xtrail for sale, sell old battery, ford mustang used cars for sale, sell my car fast online quote, good place to buy used cars online, old car sale near me, look at this see about car selling info on top of 2013 wrx sti for sale, ford raptor for sale used, trade in car for cash near me, we buy cars website, peugeot 208 used cars for sale, sale my vehicle, places to sell cars online, sale your car online free, second cars for sale, sell junk car md, best price car sales, sell bmw parts online, private sales cars for sale, old suzuki 4wd for sale, buy sell used cars, try this linked here on car selling link for sell car quickly online, places that will buy your used car, auto sell near me, old junk car for sale, real cars for sale, sell old car parts, sell my car easy, good place to buy used cars online, bristol street motors sell my car, best way to sell a non running car, new used cars for sale, . See More Handy Hints For Selecting Disposable Vapes 77_15ea

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Free Ideas For Considering Custom Sportswear

Post by FrankJScott » Tue Mar 21, 2023 12:35 pm

In response to the people inquiring about contemporary klismos fabric side chair, canadian made outdoor furniture, classic furniture online, small living, unique dressers, modern designer desks, luxury modern dining room, round swivel barrel chair, comfortable chair, cheap contemporary sofa, classic oak dining chairs, milano large classic linen fabric living room chaise lounge, classic sectional sofa, tv stand cabinet design, scandinavian design roseville, tv room couches, wayfair king bed, legacy furniture dining table, modern console table, west elm accent chair, I recommend this how to dress a bedside table for modern glass extendable dining table, king size bedroom furniture sets, summer classics adirondack chairs, curtain eyelet maker, thomasville artesia contemporary grey fabric sectional with ottoman, oxford garden classic bench, contemporary glass and chrome coffee table, steel table legs manufacturers, black contemporary dining table, small accent chairs, tv stand decorative items, sofa scandi style, king bed in a box, steel furniture manufacturers, darvin furniture living room sets, fancy living room sets, leather sofa manufacturers near me, wayfair contemporary dining chairs, silver glass coffee table, contemporary rocker recliner, also. See More Handy Facts For Picking Custom Sportswear 1d1ac70

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Handy Suggestions For Deciding On E Surfboards

Post by FrankJScott » Wed Apr 12, 2023 8:30 am

For the people talking about inflatable efoil, efoil fly, buy efoil surfboard, efoil boat, awake ravik electric surfboard, e wave surf, I highly recommend this source on e surfboards site or best electric surfboard, laowai electric surfboard, best motorized surfboard, diy hydrofoil surfboard, ravik jet board, lampuga air inflatable jetboard, alongside all this check this out for e surfboards tips and don't forget tuodds electric surfboard, yujet jetboard, ravik jet board, e foil cost, electric wakeboard foil, electric surf foil, not to mention this learn more for e surfboards blog which is as good as fliteboard battery, lift surf foil 200 wing, maxifun surf electric surfboard, yujet review, nsp e+, efoil diy, as well as here are the findings on e foils advice as well as electric powered hydrofoil surfboard, electric surfboard with hydrofoil, electric portable surfboard 2.0, cheapest electric foil board, efoil sale, best electric hydrofoil board, not to mention this homepage about e foils info and don't forget electric surfboard shark tank, electric water jet surfboard, efoil remote control, lampuga air price, battery powered surfboard, carver jet board, alongside all weblink for e surfboards tips which is about efoilusa, powered surfboard foil, cheapest e foil, flite e foil, water powered surfboard, efoil review, and don't forget this on the main page about e foils url not to mention foil e, radinn electric jetboards, radinn surfboard review, surfboard with battery, ms surfboards electric lady, jetsurf electric skateboard, alongside all this use this link on electric surfboards info and don't forget efoil electric hydrofoil surfboard, radinn surf, lampuga board price, surfboard hydrofoil for sale, hurto electric surfboard, electric powered surfboard for sale, not to mention straight from the source on electric surfboards advice and don't forget buy motorized surfboard, starboard e type foil, jet surf electric surfboard review, electric hydrofoil surfboard cost, buy electric hydrofoil surfboard, youtube efoil, which is also great. Finally, have a look at this more tips here on e surfboards tips with foil surfing electric, awake electric surfboard price, diel electric surfboard, hydroplane surfboard, kedean electric surfboard, motor powered surfboard, for good measure. Check more @ Handy Info On Picking ¸ÔÆ¢°ËÁõ dec9a89

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

New Facts To Picking Software Download

Post by FrankJScott » Sat Apr 22, 2023 12:02 pm

In response to the guy talking about preactivated software download, nvivo free download full version crack, video to mp3 converter download for pc, idm crack 64 bit, pdf download for pc windows 10, coreldraw free download full version with crack, I highly suggest this see post about software keygen hack info or itop screen recorder pro crack, download audacity full crack, download foxit editor full crack, wondershare pdf password remover crack keygen, spss mac download crack, download arduino ide full crack, alongside all this continue on software free download details as well as download microsoft office crack 2022, youtube to mp4 converter cnet, adobe acrobat dc free download, ableton live 11 crack download, pdf download for pc windows 7, crack avast cleanup premium, alongside all this your input here for free software download details which is as good as coreldraw 17 free download full version with crack, youtube videos downloader for windows 10, youtube app for pc windows 7, global mapper download crack, download filmora 32 bit full crack, melodyne serial number free, alongside all click this link on software keygen hack tips and don't forget glary utilities free download, tradingview pro crack pc, download hitfilm express full crack, movavi video converter crack download, download winzip for mac full crack, bluebeam revu keygen, alongside all this recommended you read on free software keygen advice not to mention outbyte pc repair crack download, cool edit pro free download, video app download for pc, free download app, burnaware free download, best apps for pc windows 7, on top of on the main page for free software keygen forum which is about epson l3210 resetter crack free download, download solidworks full crack, iobit uninstaller 11 pro serial key 2022, forest pack 7 free download crack, adobe reader 32 bit download windows 10, minitab free download full version with crack, on top of this listen to this podcast on free software crack tips on top of cyberlink powerdirector 365 free download full version with crack, sony vegas pro 17 free download full version crack, adobe illustrator cc 2015 full crack 32bit 64bit, idm full version with crack free download rar, free download autocad 2007 64 bit full version with crack, avast ultimate crack, and don't forget this find out more about free software keygen advice as well as rar crack download for pc, ultraiso serial key, preactivated software download, crack sketchup 2016, foxit pdf editor free download, download itools full crack, on top of click for source on software keygen crack info and don't forget virtual dj 5.0 free download with crack, studio one 4 free download full version crack, sony sound forge pro 11 full crack & keygen, pdf crack download, free download opera, jlr sdd 160 crack, which is also great. Finally, have a look at this learn more here about software keygen hack link with adobe photoshop crack version 64 bit youtube, movie maker download windows 7, peachtree software free download with crack, recuva recovery, free download corel draw x5 full version with serial number, download adobe premiere pro full crack, for good measure. Check more @ Free Tips On Choosing Software Download c77_02c

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Best Info For Selecting Business Massage

Post by FrankJScott » Thu Apr 27, 2023 1:23 pm

To the people inquiring about lomi lomi massage, lpg massage, miko shiatsu foot massager, new business trip, good massage places near me, cheap business travel, naipo massager, writing off a business trip, certified massage therapist, writing off business trips, hua hin thai massage, take a business trip, thai massages near me cheap, foreign business trip, male thai massage therapist near me, small business travel agency, thai massage business bay, korean thai massage, massage se, home massage therapist, I suggest this 출장홈타이 for geometry massage, thai massage manhattan, breast massage oil, fascia massage, massage open, thai massage fourways, tennis elbow massage, infant massage, acupressure massage, thailand massage therapist, knee massager, bergen thai massage, thai massage browns bay, best foot massager for neuropathy, best massage oil, thai massage kensington, thai massage setia alam, thai massage garden city, thai massage westheimer, kk massage, also. See More New Reasons On Deciding On Business Massage ec9a89a

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Handy Facts To Selecting Slot Gacor Hari Ini

Post by FrankJScott » Sun May 07, 2023 9:28 am

To the man talking about happy judi link alternatif, judi slot 77, situs idn live, game pragmatic yang gacor hari ini, whizz88 slot, flow gaming slot, I highly suggest this find for slot gacor advice or game slot cuan, agen joker123 slot, judi mesin online, judi slot online android, link alternatif qq gaming, p play slot, on top of this read full report on slot88 details not to mention cara transfer pragmatic play, cmd77 judi slot online, mpo888 judi slot online, slot online deposit 25000, wd joker123, idn slot 188, not to mention this website for slot gacor hari ini advice which is as good as hoki judi slot, mpo 4d slot, dunia win slot demo, endless treasure slot, mustang gold slot, agen slot 168, on top of continue reading this about judi online info on top of slot online pg soft, nama nama slot mpo, nama game slot online, slot game yang mudah menang, judi togel via ovo, game slot gratis pragmatic, as well as this this hyperlink for slot online advice alongside all judi slot lemacau, judi bonus tanpa deposit, game slot yang lagi gacor, game pragmatic gacor, demo slot joker pragmatic, semibola com games slots habanero, on top of listen to this podcast about slot online blog which is about judi via gopay, online slot 777, sistem rng slot, slot agen138, game slot yg lagi hoki, agen slot joker gaming, on top of this learn more here about slot maxwin blog not to mention bahasa slot judi, agen vip slot, judi slot online bonus new member 200, selot sip777, demo slot provider joker gaming, ainsworth free slots, not to mention this here about slot maxwin url alongside all agen 4d slot, winning568, pg soft demo mahjong, idr 188 slot, rakuten365 slot, surat 4d slot online, not to mention my latest blog post on situs slot tips alongside all casino online free spins no deposit, goldwin678 online, cara menang main aztec gems, agen joker123 deposit 25000, game slot gacor siang hari, plaza judi slot, which is also great. Finally, have a look at this here for slot88 blog with slot gacor 24 jam, kingdom slots online, idn play slot, agen slot 389, judi slot 369, idns slot, for good measure. Check more @ Good Facts For Considering Demo Slot Gates Of Olympus 89a61d1

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Updated Rezerves Dalas Blog

Post by FrankJScott » Sat Jul 29, 2023 8:59 am

For the man asking about bmw gs parts, mustang exhaust, tapatio auto parts, bmw x3 coolant reservoir, car door latch, bmw z3 rear window replacement, autozone vin, guibo bmw, carparts com used, acme auto parts, car fob battery, rear mount turbo, brake caliper, m340i diffuser, brake pad replacement cost near me, s1000rr carbon fiber, bmw z4 steering wheel, e92 interior trim, shocks and struts replacement, rock auto part, dorman auto parts, m3 exhaust, ford focus alternator, bmw 440i downpipe, 31336871812, I can vouch for this Car parts for bmw e90 coilovers, bmw f30 m3 front bumper, m240i rear diffuser, auto performance shops near me, x5 accessories, bmw e46 tuning parts, bmw carbon fiber steering wheel, 2011 bmw 328i starter, o reilly auto, bmw x5 fuel pump, bmw e60 front lip, bmw hub, 340i exhaust, bmw 335i injectors, cheap auto parts near me, hyundai spares, bmw x3 wiper blades, bmw parts online, 11368696446, bmw vanos solenoid, bmw m performance parts, e46 air filter, bmw rotors, also. See More High Rated Bmw Parts Info 1ac76_e

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Useful Saling Silang Blog

Post by FrankJScott » Sun Jul 30, 2023 5:58 pm

For situs judi terbaik, game slot 88, slot judi 88, game slot web, pg slot link alternatif, pemain slot online, permainan online judi, ini slot 88, permainan pg soft, situs slot online, bermain slot online, slot adalah judi, slot games slot, online situs, slot permainan slot, game game slot, situs slot terpopuler, situs game bola online, situs situs slot online, www judi slot com, follow the top rated saling silang hints for more info including link alternatif game slot, situs link slot, situs game slot online terbaik, www judi slot com, bola slot 88, mesin slot alternatif, alternatif slot, slot 88 login, mesin slot link alternatif, situs slot terpopuler, judi online slot, link situs slot, slot judi 88, login slot 88, situs 88, slot game terbaik, mesin gaming slot, link slot alternatif, situs game slot terbaik, link judi slot, and more.

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Best Google Tips

Post by FrankJScott » Tue Aug 01, 2023 12:07 am

I suggest you google it :)

FrankJScott
a grimling bloodguard
a grimling bloodguard
Posts: 1436
Joined: Sun Feb 19, 2023 7:11 am

Excellent Product Site

Post by FrankJScott » Tue Jan 30, 2024 9:06 pm

Please try Google before asking about Updated Product Info 8dec9a8