My first script menu

User Tag List

Results 1 to 3 of 3
  1. #1
    krispig's Avatar Private
    Reputation
    1
    Join Date
    Apr 2010
    Posts
    13
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    My first script

    Okay, so this is my first script ever. its a boss scripts of Anub'arak in Azjol Nerub.
    I would like some feedback/tips, I know this is a crap script since it's my first I only post this to get some feedback to improve my knowledge.
    This boss script would prolly leave lots of bugs and a really bad(even playable?) encounter, and the adds spawns are not blizzlike, i know :P

    Code:
    ////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////// Anub'Arak ///////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////
    
    #define BOSS_ANUBARAK 29120
    
    #define CARRION_BEETLES 53520
    
    #define IMPALE 53454
    #define LEECHING_SWARM 53467
    #define POUND 53472
    
    #define HC_IMPALE 59446
    #define HC_LEECHING_SWARM 59430
    #define HC_POUND 59433
    #define SUBMERGE 65981
    
    int fas = 0;
    int fas_stop = false;
    uint32 phase_one_first = 1;
    uint32 phase_one_second = 1;
    uint32 phase_one_third = 1;
    
    
    class AnubArakAI : public MoonScriptBossAI
    {
    
    	MOONSCRIPT_FACTORY_FUNCTION(AnubArakAI, MoonScriptBossAI);
    	AnubArakAI(Creature* pCreature) : MoonScriptBossAI(pCreature)
    	{
    		
    			AddSpell(CARRION_BEETLES, Target_Self, 70, 0, 20);
    		
    			
    			SpellDesc* LeechingSwarm = AddSpell(LEECHING_SWARM, Target_Self, 20, 0, 25);
    			SpellDesc* Pound = AddSpell(POUND, Target_Self, 10, 3.2f, 20);
    		
    		
    		
    				
    			SpellDesc* HcLeechingSwarm = AddSpell(HC_LEECHING_SWARM, Target_Self, 20, 0, 25);
    			SpellDesc* HcPound = AddSpell(HC_POUND, Target_Self, 10, 3.2f, 20);
    
    			if( !IsHeroic() )
    			{
    				LeechingSwarm->mEnabled = true;
    				Pound->mEnabled = true;
    				HcLeechingSwarm->mEnabled = false;
    				HcPound->mEnabled = false;
    				AddPhaseSpell(2, AddSpell(IMPALE, Target_RandomDestination, 20, 0, 10, 0, 100));
    			}
    			else
    			{
    				LeechingSwarm->mEnabled = false;
    				Pound->mEnabled = false;
    				HcLeechingSwarm->mEnabled = true;
    				HcPound->mEnabled = true;
    				AddPhaseSpell(2, AddSpell(HC_IMPALE, Target_RandomDestination, 20, 0, 10, 0, 100));
    			};
    		
    
    			LeechingSwarm->AddEmote("Your armor is useless against my locusts!", Text_Yell);
    			LeechingSwarm->AddEmote("The pestilence upon you!", Text_Yell);
    			
    			HcLeechingSwarm->AddEmote("Your armor is useless against my locusts!", Text_Yell);
    			HcLeechingSwarm->AddEmote("The pestilence upon you!", Text_Yell);
    			
    		
    
    			AddEmote(Event_OnCombatStart, "Eternal agony awaits you!", Text_Yell);
    			AddEmote(Event_OnDied, "Never thought... I would be free of him...", Text_Yell);
    		}
    	
    	
    				
    	
    	
    			void OnCombatStart(Unit* pTarget)
    		{
    			SetPhase(1);
    			ParentClass::OnCombatStart(pTarget);
    		}
    	
    			
    			void AIUpdate()
    		{
    			
    			if(GetPhase() == 1)
    			{
    				if( !IsHeroic() )
    				{
    					LeechingSwarm->mEnabled = true;
    					Pound->mEnabled = true;
    
    				}
    				else
    				{
    					HcLeechingSwarm->mEnabled = true;
    					HcPound->mEnabled = true;
    				}
    				fas_stop = false;
    
    
    			}
    
    			
    			
    			
    			
    			//Phase 2 75%
    			if(GetHealthPercent() <= 75 && GetPhase() == 1 && phase_one_first == 1)
    			{
    				
    				SetPhase(2);
    				fas++;
    				
    
    				ApplyAura(SUBMERGE);
    				mPhaseSwitchTimer = AddTimer( 40000 );
    
    				Emote ("Come forth, my brethren. Feast on their flesh!");
    				LeechingSwarm->mEnabled = false;
    				Pound->mEnabled = false;
    				HcLeechingSwarm->mEnabled = false;
    				HcPound->mEnabled = false;
    				ClearHateList();
    				&AnubArakAI::AnubarAdds;
    				phase_one_first = 2;
    				phase_one_second = 1;
    
    			}
    			
    			if( IsTimerFinished( mPhaseSwitchTimer ))
    			{
    				SetPhase(1);
    				ResetTimer(mAddsSpawn, 40000);
    
    			}
    
    			//Phase 2 50%
    			if(GetHealthPercent() <= 50 && GetPhase() == 1 && phase_one_second == 1)
    				{
    				
    				SetPhase(2);
    				fas++;
    				
    
    				ApplyAura(SUBMERGE);
    				mPhaseSwitchTimer = AddTimer( 40000 );
    
    				Emote ("Come forth, my brethren. Feast on their flesh!");
    				LeechingSwarm->mEnabled = false;
    				Pound->mEnabled = false;
    				HcLeechingSwarm->mEnabled = false;
    				HcPound->mEnabled = false;
    				ClearHateList();
    				&AnubArakAI::AnubarAdds;
    				phase_one_second = 2;
    				phase_one_third = 1;
    				
    
    
    				}
    			if( IsTimerFinished( mPhaseSwitchTimer ))
    				{
    				SetPhase(1);
    				ResetTimer(mAddsSpawn, 40000);
    
    				}
    
    				//Phase 3 25%
    				if(GetHealthPercent() <= 50 && GetPhase() == 1  && phase_one_third == 1)
    				{
    				
    				SetPhase(2);
    				fas++;
    				
    
    				ApplyAura(SUBMERGE);
    				mPhaseSwitchTimer = AddTimer( 40000 );
    
    				Emote ("Come forth, my brethren. Feast on their flesh!");
    				LeechingSwarm->mEnabled = false;
    				Pound->mEnabled = false;
    				HcLeechingSwarm->mEnabled = false;
    				HcPound->mEnabled = false;
    				ClearHateList();
    				&AnubArakAI::AnubarAdds;
    				phase_one_third = 2;
    				
    
    
    				}
    			if( IsTimerFinished( mPhaseSwitchTimer ))
    				{
    				SetPhase(1);
    				ResetTimer(mAddsSpawn, 40000);
    
    				}
    			
    
    
    		}
    
    		void OnTargetDied(Unit* pTarget)
    		{
    			int randAnnounce;
    			randAnnounce=rand()%3;
    			switch (randAnnounce)
    			{
    			case 0:
    				Emote ("You shall experience my torment, first-hand!", Text_Yell);
    			break;
    
    			case 1:
    				Emote("You have made your choice.", Text_Yell);
    			break;
    
    			case 2:
    				Emote("Soon, the Master's voice will call to you.", Text_Yell);
    			break;
    			}
    		}
    
    
    
    
    	bool AnubarAdds(Creature *pCreature)
    	{
    	mAddsSpawn = AddTimer (40000);
    	
    	//fas1
    	if (fas == 1 && fas_stop == false)
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		fas_stop = true;
    		
    	}
    	if (fas == 1 && mAddsSpawn >= 15000 && mAddsSpawn <= 17000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    
    	}
    		if (fas == 1 && mAddsSpawn >= 30000 && mAddsSpawn <= 32000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		}
    
    		//fas2
    			if (fas == 2 && fas_stop == false)
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		fas_stop = true;
    	}
    		if (fas == 2 && mAddsSpawn >= 10000 && mAddsSpawn <= 12000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    
    	}
    		if (fas == 2 && mAddsSpawn >= 20000 && mAddsSpawn <= 22000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ()+ rand()%30, 0, true, false, 0 ,0);
    		}
    
    		if (fas == 2 && mAddsSpawn >= 30000 && mAddsSpawn <= 32000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		}
    		
    
    		//fas3
    			if (fas == 3 && fas_stop == false)
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		fas_stop = true;
    	}
    		if (fas == 3 && mAddsSpawn >= 10000 && mAddsSpawn <= 12000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    
    	}
    		if (fas == 3 && mAddsSpawn >= 20000 && mAddsSpawn <= 22000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		}
    
    		if (fas == 3 && mAddsSpawn >= 30000 && mAddsSpawn <= 32000 && !IsTimerFinished( mPhaseSwitchTimer ))
    	{
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0, 0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(29214, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		_unit->GetMapMgr()->GetInterface()->SpawnCreature(31599, _unit->GetPositionX() + rand()%30, _unit->GetPositionY() + rand()%30, _unit->GetPositionZ() + rand()%30, 0, true, false, 0 ,0);
    		}
    	return true;
    	}
    
    
    
    	SpellDesc* Submerge;
    
    	SpellDesc* LeechingSwarm;
    	SpellDesc* Pound;
    	SpellDesc* HcLeechingSwarm;
    	SpellDesc* HcPound;
    
    	int32 mPhaseSwitchTimer;
    	int32 mAddsSpawn;
    	
    	};

    My first script
  2. #2
    Link_S's Avatar Member
    Reputation
    125
    Join Date
    Dec 2008
    Posts
    293
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I'm one of those people who's more comfortable with the old way of scripting bosses, that's why I can't give you any feedback about boss coding at all.

    But I could atleast give you a tip with C++.
    You're code seems very disorganized with unnecessary spaces/tabs. You could organize your code using tabs to get the code more readable and understandable
    Why do I need a signature?

  3. #3
    krispig's Avatar Private
    Reputation
    1
    Join Date
    Apr 2010
    Posts
    13
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    thanks for reply , but this is not how the code looks in my visual studio, it became that ugly when i copied that into this post :P

Similar Threads

  1. [Opion] on my first lua script
    By jordddm in forum World of Warcraft Emulator Servers
    Replies: 4
    Last Post: 03-22-2009, 01:55 PM
  2. [Release] Buff NPC (my first LUA script)
    By TheNacho in forum WoW EMU General Releases
    Replies: 3
    Last Post: 01-31-2009, 06:33 PM
  3. Links's C++ WarpNPC (First script)
    By Link_S in forum WoW EMU General Releases
    Replies: 5
    Last Post: 12-18-2008, 09:05 AM
  4. [Script] Launch aoc without requiring the patcher to run first
    By raindog in forum Age of Conan Exploits|Hacks
    Replies: 18
    Last Post: 07-10-2008, 02:04 AM
  5. [Release Lua] One of My First Lua Scripts
    By Juicyz in forum World of Warcraft Emulator Servers
    Replies: 5
    Last Post: 03-28-2008, 02:03 AM
All times are GMT -5. The time now is 02:23 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search