Modifikation am Classic Team Script

12/08/2010 17:24 FoGzone#1
Also ich hatte die Idee ein classic team script zu bauen, das auf 2 Scripten basiert. Zum einen auf dem Classic Team Script von Kolton (eon) und dem normalen Dia script im D2NT.

Hier is mal das script von kolton:
Code:
//cmd vars - do NOT touch
	var _MyDT_PreMessage = "";
	var _sealpos = 0;
	var safex;
	var safey;
	var prevx;
	var prevy;
//leader var, will be in char config, maybe
	var leader = "NAME";

function NTMain() {
	Include("libs/common/NTCommon.ntl");
	NTC_IncludeLibs();
	NTC_IncludeConfig("NTBot/char_configs");

	NT_LoadConfig();
	NTSI_LoadNIPFiles("NTBot/item_configs");

	NTA_Initialize();
	
	if(!NTTM_CheckAct()) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
		return;
	}
	
	NTC_Delay(1000);
	
	if(!NTTM_CheckAct(4)) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
		return;
	}
	
	RegisterEvent(EVENT_GAMEMSG, quitfunc); 
	
	TD_File("NTBot/bots/TeamD.txt", 1);
	
	if(me.classid == 1) {
		if(!NTTM_CheckAct(1)) {
			NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
			return;
		}
		
		if(NTConfig_DelayStart)
			NTC_Delay(20000);
		
		Print("Loading sorc function");
		NTTMGR_TownManager();	
		TD_Sorcfunc();
	}
	
	if(me.classid == 3) {
		Print("Loading hammer function");
		NTTMGR_TownManager();
		NTTM_TownMove("portalspot");
		
		while(1) {
			TD_TeamCommands();
			Delay(200);
		}
	}
	
	if(me.classid == 4) {
		Print("Loading barb function");
		NTTMGR_TownManager();	
		NTTM_TownMove("portalspot");
		
		while(1) {
			TD_TeamCommands();
			Delay(200);
		}
	}
	
	NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}

function TD_Sorcfunc() { //work in progress!
	NTC_Delay(500);
	
	if(!NTTM_TownMove("waypoint")) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
		return;
	}
	
	if(!NTM_TakeWaypoint(107)) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
		return;
	}
	
	NTC_Delay(500);
	NTM_MoveTo(me.areaid, me.x+5, me.y);
	for(var i = 0 ; i < 5 ; i++) {
		if(NTM_MakeTP())
			break;
	}
	
	TD_File("NTBot/bots/TeamD.txt", 1, ".bo");
	
	while(!me.GetState(32))
		NTC_Delay(500);

	NTP_DoPrecast(true);
		
	if(!TD_MoveTo(108, 7802, 5591)) { //urdars! and svs!
		NTC_SendMsgToScript("NTBotGame.ntj", "TD_MoveTo()");
		return;
	}

	if(TD_DetectLayout(1) == 1) { 
		TD_MoveTo(me.areaid, 7701, 5299);
		TD_Deploy(7681, 5299, 0, 0, 15, 15);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	} else {
		TD_MoveTo(me.areaid, 7700, 5313);
		TD_Deploy(7680, 5313, 15, 15, 0, 0);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	}
	
	TD_File("NTBot/bots/TeamD.txt", 1, ".s1"); //vizier
	
	if(!TD_VizierSeal()){
		NTC_SendMsgToScript("NTBotGame.ntj", "Seal opening");
		return;
	}

	NTM_MoveTo(me.areaid, safex, safey); 
	
	while(!TD_IsPlayerOut()) {
		NTA_KillMonster(GetLocaleString(2851));
		NTA_ClearPosition(10);
		NTSI_PickItems();
		NTM_MoveTo(me.areaid, safex, safey);
	}
	
	if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
	{
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
		return;
	}
	
	NTP_DoPrecast(true);
	
	if(TD_DetectLayout(3) == 1) { 
		TD_MoveTo(me.areaid, 7900, 5291);
		TD_Deploy(7920, 5291, 15, 15, 0, 0);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	} else {
		TD_MoveTo(me.areaid, 7910, 5278); 
		TD_Deploy(7930, 5278, 0, 15, 15, 0);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	}

	TD_File("NTBot/bots/TeamD.txt", 1, ".s3"); //infector

	if(!TD_InfectorSeal()){
		NTC_SendMsgToScript("NTBotGame.ntj", "Seal opening");
		return;
	}
	
	NTM_MoveTo(me.areaid, safex, safey); 
	
	while(!TD_IsPlayerOut()) {
		NTA_KillMonster(GetLocaleString(2853));
		NTA_ClearPosition(10);
		NTSI_PickItems();
		NTM_MoveTo(me.areaid, safex, safey); 
	}
	
	
	if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
	{
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
		return;
	}
	
	NTP_DoPrecast(true);
	
	if(TD_DetectLayout(2) == 1) {
		TD_MoveTo(me.areaid, 7776, 5230);
		TD_Deploy(7776, 5220, 0, 0, 15, 15);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	} else {
		TD_MoveTo(me.areaid, 7779, 5200); 
		TD_Deploy(7779, 5180, 0, 0, 15, 15);
		for(var i = 0 ; i < 5 ; i++) {
			if(NTM_MakeTP())
				break;
		}
	}
	
	TD_File("NTBot/bots/TeamD.txt", 1, ".s2"); //de seis

	if(!TD_DeSeisSeal()){
		NTC_SendMsgToScript("NTBotGame.ntj", "Seal opening");
		return;
	}
	
	NTM_MoveTo(me.areaid, safex, safey); 
	
	while(!TD_IsPlayerOut()) {
		NTA_ClearPosition(10);
		NTSI_PickItems();
		NTM_MoveTo(me.areaid, safex, safey);
	}
	
	if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
	{
		NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
		return;
	}
	
	NTP_DoPrecast(true);
	
	if(!NTM_MoveTo(me.areaid, 7792, 5292)) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveTo()");
		return;
	}

	NTM_MakeTP();
	
	TD_File("NTBot/bots/TeamD.txt", 1, ".d");
	
	NTC_FindUnit(NTC_UNIT_MONSTER, 243, 100);
	if(!NTA_KillMonster(243)) {
		NTC_SendMsgToScript("NTBotGame.ntj", "NTA_KillMonster()");
		return;
	}
	NTSI_PickItems();
	
	//anything else?
}

//--internal functions--

function quitfunc(msg, type) { //quit when leader leaves game
	if(msg.indexOf(leader) != -1 && (msg.indexOf("weaken") != -1 || msg.indexOf("timeout") != -1)) { //if leader quits
	//if(msg.indexOf("weaken") != -1 || msg.indexOf("timeout") != -1) { //if anyone quits
		NTC_Delay(500);
		ExitGame();
	}
}

function TD_Preattack(classid, extrahammers) { //extra hammers = hammers cast after the seal boss is spawned
	NTC_PutSkill(NTConfig_AttackSkill[4], NTC_HAND_RIGHT);
	while(!NTC_FindUnit(NTC_UNIT_MONSTER, classid))
		NTC_CastSkill(NTConfig_AttackSkill[3], 2);
	for(var i = 0 ; i < extrahammers ; i++) {
		NTC_CastSkill(NTConfig_AttackSkill[3], 2);
	}
}

function TD_VizierSeal() { //vizier
	for(var i = 0 ; i < 5 ; i++){
		NTM_MoveToPresetUnit(me.areaid, 2, 395);
		var _seal = NTC_FindUnit(NTC_UNIT_OBJECT, 395, 5);
		NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _seal);
		
		NTC_Delay(350);	
		
		if(_seal.mode <= 0)
			NTM_MoveTo(me.areaid, safex, safey);
		else
			break;
			
		NTC_Delay(250);	
		
		if(i == 4 && _seal.mode <= 0) 
			return false;
	}
	for(i = 0 ; i < 5 ; i++){
		NTM_MoveToPresetUnit(me.areaid, 2, 396);
		_seal = NTC_FindUnit(NTC_UNIT_OBJECT, 396, 5);
		NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _seal);
		
		NTC_Delay(350);	
		
		if(_seal.mode <= 0)
			NTM_MoveTo(me.areaid, safex, safey);
		else
			break;
			
		NTC_Delay(250);
		
		if(i == 4 && _seal.mode <= 0) 
			return false;
	}
	return true;
}

function TD_DeSeisSeal(){ //de seis
	for(var i = 0 ; i < 5 ; i++){
		NTM_MoveToPresetUnit(me.areaid, 2, 394);
		_seal = NTC_FindUnit(NTC_UNIT_OBJECT, 394, 5);
		NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _seal);
		
		NTC_Delay(350);	
		
		if(_seal.mode <= 0)
			NTM_MoveTo(me.areaid, safex, safey);
		else
			break;
			
		NTC_Delay(250);	
		
		if(i == 4 && _seal.mode <= 0) 
			return false;
	}
	return true;
}

function TD_InfectorSeal() { //infector
	for(var i = 0 ; i < 5 ; i++){
		NTM_MoveToPresetUnit(me.areaid, 2, 393);
		_seal = NTC_FindUnit(NTC_UNIT_OBJECT, 393, 5);
		NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _seal);
	
		NTC_Delay(350);	
	
		if(_seal.mode <= 0)
			NTM_MoveTo(me.areaid, safex, safey);
		else
			break;
			
		NTC_Delay(250);	
		
		if(i == 4 && _seal.mode <= 0) 
			return false;
	}
	for(i = 0 ; i < 5 ; i++){
		NTM_MoveToPresetUnit(me.areaid, 2, 392);
		_seal = NTC_FindUnit(NTC_UNIT_OBJECT, 392, 5);
		NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _seal);
		
		NTC_Delay(350);	
	
		if(_seal.mode <= 0)
			NTM_MoveTo(me.areaid, safex, safey);
		else
			break;
			
		NTC_Delay(250);	
		
		if(i == 4 && _seal.mode <= 0) 
			return false;
	}
	return true;
}

function TD_TeamCommands() {
    var _msg = TD_File("NTBot/bots/TeamD.txt", 0);

    if (_msg && _msg != _MyDT_PreMessage) {
        _MyDT_PreMessage = _msg;

        switch (_msg.substring(_msg.indexOf("/") + 1)) {
		case ".bo":
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 107, leader);
				NTC_Delay(500);
				NTP_DoPrecast(true);
				
				//while(!me.GetState(32))
					NTC_Delay(3500);
				
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
			}
			if(me.classid == 4) { //Barb
				NTM_UsePortal("BluePortal", 107, leader);
				while(!me.GetState(32))
					NTP_DoPrecast(true);
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
			}
			
			break;
		case ".s1": //vizier
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 108, leader);

				TD_Preattack(GetLocaleString(2851), 5);
				TD_KillMonster(GetLocaleString(2851));
				NTA_ClearPosition(5);
				NTSI_PickItems();

				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
				NTP_DoPrecast(true);
			}
			if(me.classid == 4) { //Barb
				NTM_UsePortal("BluePortal", 108, leader);
				//for(var i = 0 ; i < 3 ; i++) {
					NTC_CastSkill(130, NTC_HAND_RIGHT);
				//	Delay(300);
				//}
				NTP_DoPrecast(true);
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
			}
			
			break;
		case ".s2": //de seis
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 108, leader);
				
				TD_Preattack(GetLocaleString(2852), 10);
				TD_KillMonster(GetLocaleString(2852));
				NTA_ClearPosition(15);
				NTSI_PickItems();
				
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
				NTP_DoPrecast(true);
			}
			if(me.classid == 4) { //Barb
				NTM_UsePortal("BluePortal", 108, leader);
				for(var i = 0 ; i < 3 ; i++) {
					NTC_CastSkill(130, NTC_HAND_RIGHT);
					Delay(300);
				}
				NTP_DoPrecast(true);
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
			}
			
			break;
		case ".s3": //infector
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 108, leader);

				TD_Preattack(GetLocaleString(2853), 5);
				TD_KillMonster(GetLocaleString(2853));
				NTA_ClearPosition(15);
				NTSI_PickItems();
				
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
				NTP_DoPrecast(true);
			}		
			if(me.classid == 4) { //Barb
				NTM_UsePortal("BluePortal", 108, leader);
				//for(var i = 0 ; i < 1 ; i++) {
					NTC_CastSkill(130, NTC_HAND_RIGHT);
				//	Delay(300);
				//}
				NTP_DoPrecast(true);
				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
			}
			
			break;
		case ".d":
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 108, leader);

				NTC_FindUnit(NTC_UNIT_MONSTER, 243, 100);

				if(!TD_KillMonster(243)) {
					NTC_SendMsgToScript("NTBotGame.ntj", "TD_KillMonster()");
					return;
				}

				NTSI_PickItems();
			}
			if(me.classid == 4) { //Barb
				NTM_UsePortal("BluePortal", 108, leader);
				NTP_DoPrecast(true);
				
				//do something until diablo dies
				
				var _diablo = NTC_FindUnit(NTC_UNIT_MONSTER, 243)
				while(_diablo && _diablo.hp > 0)
					NTC_Delay(500);
			}
			
			break;
		case ".u": //urdars! and svs!
			if(me.classid == 3) { //Hammerdin
				NTM_UsePortal("BluePortal", 108, leader);

				if(NTC_FindUnit(NTC_UNIT_MONSTER, 362))
					TD_Preattack(362, 5);
				else if(NTC_FindUnit(NTC_UNIT_MONSTER, 189))
					TD_Preattack(189, 5);
				NTA_ClearPosition(15);
				NTSI_PickItems();

				if(!NTM_UsePortal("BluePortal", 103, leader)) //or make my own?
					NTTM_CheckAct();
				NTP_DoPrecast(true);
			}
			if(me.classid == 4) { //Barb - ADD SOMETHING EVENTUALLY
				//Say("Kolton you lazy bastard!");
				NTC_Delay(250);
			}
			
			break;
		}
    }
}

function TD_DetectLayout(seal) {
	switch(seal) {
	case 1:
		_sealpos = GetPresetUnits(me.areaid, NTC_UNIT_OBJECT);
		for(var i = 0 ; i < _sealpos.length ; i++) {
			if(_sealpos[i].id == 396) {
				if(_sealpos[i].roomy*5 + _sealpos[i].y == 5275)
					return 1;
				else
					return 2;

				break;
			}
		}
		break;
	case 2:
		_sealpos = GetPresetUnits(me.areaid, NTC_UNIT_OBJECT);
		for(i = 0 ; i < _sealpos.length ; i++) {
			if(_sealpos[i].id == 394) {
				if(_sealpos[i].roomx*5 + _sealpos[i].x == 7773)
					return 1;
				else
					return 2;

				break;
			}
		}
		break;	
	case 3:
		_sealpos = GetPresetUnits(me.areaid, NTC_UNIT_OBJECT);
		for(i = 0 ; i < _sealpos.length ; i++) {
			if(_sealpos[i].id == 392) {
				if(_sealpos[i].roomx*5 + _sealpos[i].x == 7893)
					return 1;
				else
					return 2;

				break;
			}
		}
		break;
	}
}

function TD_IsPlayerOut(area) { //function by Thursty
	var _player;
	var _myPartyId;

	_player = GetPlayerUnit();
	_myPartyId = _player.partyid;

	if(arguments.length < 1)
		_area = me.areaid;
	else
		_area = area;

	do {
		if(_player.areaid == _area && _myPartyId == _player.partyid)
			return false;

		NTC_Delay(100);

	} while(_player.GetNext());
	
	return true;	
}

function TD_File(path, mode, msg, delay) { //big thanks to all the koreans out there
    var _msg  = "";
    var _line = "";
    var _fileHandle;
    var _isFileCheck = false;

    if (arguments.length < 3) msg   = "";
    if (arguments.length < 4) delay = (mode > 0) ? 5 : 2;

    while (delay--) {
        if (mode == 2 && !_isFileCheck) {
            _fileHandle = FileOpen(path, 0);
            if (!_fileHandle)
                _fileHandle = FileOpen(path, 1);

            if (_fileHandle)
                _fileHandle.Close();

            _isFileCheck = true;
        }

        _fileHandle = FileOpen(path, mode);
        if (_fileHandle)
            break;

        if (delay)
            Delay(200);
    }

    if (_fileHandle) {
        if (mode == 0) {
            while (!_fileHandle.eof) {
                _line = _fileHandle.ReadLine();
                if (_line || !_fileHandle.eof)
                    _msg += _line + msg;
            }
        }
        else if (msg)
            _fileHandle.WriteLine(msg);

        _fileHandle.Close();
    }

    return _msg;
}

function TD_MoveTo(areaid, x, y, retry, clearpath)
{
	var i, n;
	var _teleport;
	var _path;
	var _retry = 0;

	if(x == me.x && y == me.y)
		return true;

	if(arguments.length < 4)
		retry = 3;

	if(arguments.length < 5)
		clearpath = false;

	if(NTC_InTown() || NTC_GetSkillLevel(54) < 1)
		_teleport = false;
	else
		_teleport = true;

	_path = GetPath(areaid, me.x, me.y, x, y, _teleport);

	if(!_path)
		return false;

	for(i = 0 ; i < _path.length ; i++)
	{
		for(n = 0 ; n < 2 ; n++)
		{
			if(_teleport)
			{
				if(NTM_TeleportTo(_path[i][0], _path[i][1])){
					if(TDConfig_FindUrdarsAndVenoms)
						TD_FindUrdar();
						break;
				}
			}
			else
			{
				if(NTM_WalkTo(_path[i][0], _path[i][1]))
					break;
			}
		}
		
		if(n < 2)
		{	
			if(clearpath)
			{
				if(!NTA_ClearPosition(20, true, 2))
					return false;

				NTP_DoPrecast(false);

				NTM_MoveTo(me.areaid, _path[i][0], _path[i][1], 1);
			}
		}
		else if(_retry < retry)
		{
			_path = GetPath(areaid, me.x, me.y, x, y, _teleport);

			if(!_path)
				return false;

			i = -1;
			_retry++;
		}
		else
			return false;
	}

	return true;
}

function TD_FindUrdar(){ 
	var _urdar = NTC_FindUnit(NTC_UNIT_MONSTER, 189);
	var _sv = NTC_FindUnit(NTC_UNIT_MONSTER, 362);

	if(_urdar){
		do{
			if (_urdar.classid == 189 && (_urdar.spectype == 9 || _urdar.spectype == 17) && _urdar.mode != 0 && _urdar.hp > 0 && _urdar.mode != 12 && _urdar.IsAttackable()){
				NTC_SendLogToOOG(NTC_LOG_COMMON, "ÿc8Killing Urdars!"); //COMMENT THIS LINE IF TESTING IS SUCCESSFUL

				//NTM_MoveTo(me.areaid, _urdar.x, _urdar.y);
				TD_Deploy(_urdar.x, _urdar.y, 20, 20, 0, 20);

				for(var i = 0 ; i < 5 ; i++) {
					if(NTM_MakeTP())
						break;
				}

                TD_File("NTBot/bots/TeamD.txt", 1, ".u");

				NTA_ClearPosition(12);
				
				while(!TD_IsPlayerOut()) {
					NTA_ClearPosition();
					NTSI_PickItems();
				}

				TD_File("NTBot/bots/TeamD.txt", 1, "bla");
				
				NTC_Delay(250);
                break;
            }
        } while(_urdar.GetNext());
    }
	else if(_sv){
		do{
			if (_sv.classid == 362 && (_sv.spectype == 9 || _sv.spectype == 17) && _sv.mode != 0 && _sv.hp > 0 && _sv.mode != 12 && _sv.IsAttackable()){
				NTC_SendLogToOOG(NTC_LOG_COMMON, "ÿc8Killing Super Venoms!"); //COMMENT THIS LINE IF TESTING IS SUCCESSFUL

				//NTM_MoveTo(me.areaid, _sv.x, _sv.y);
				TD_Deploy(_sv.x, _sv.y, 20, 20, 0, 20);

				for(var i = 0 ; i < 5 ; i++) {
					if(NTM_MakeTP())
						break;
				}

				prevx = me.x;
				prevy = me.y;

                TD_File("NTBot/bots/TeamD.txt", 1, ".u");

				NTA_ClearPosition(15);

				while(!TD_IsPlayerOut()) {
					NTA_ClearPosition();
					NTSI_PickItems();
					NTM_MoveTo(me.areaid, prevx, prevy);
				}

				TD_File("NTBot/bots/TeamD.txt", 1, "bla");

				NTC_Delay(250);
                break;
            }
        } while(_sv.GetNext());
    }
}

function TD_Deploy(x, y, plusx, minusx, plusy, minusy) { //you can build up to 5 positions (x-shaped), center position is x, y; rest are +/- offsets
	var _monster = NTC_FindUnit(NTC_UNIT_MONSTER);
	var num = [0, 0, 0, 0, 0];
	var firstnum = 100;
	
	if(!_monster)
		return NTM_MoveTo(me.areaid, x, y);
	
	do {
		if(GetDistance(_monster.x, _monster.y, x, y) <= 15)
			if(_monster.classid != 306)
				num[0]++;
		if(GetDistance(_monster.x, _monster.y, x + plusx, y) <= 15)
			if(_monster.classid != 306)
				num[1]++;
		if(GetDistance(_monster.x, _monster.y, x - minusx, y) <= 15)
			if(_monster.classid != 306)
				num[2]++;
		if(GetDistance(_monster.x, _monster.y, x, y + plusy) <= 15)
			if(_monster.classid != 306)
				num[3]++;
		if(GetDistance(_monster.x, _monster.y, x, y - minusy) <= 15)
			if(_monster.classid != 306)
				num[4]++;
	}while(_monster.GetNext())
	
	for(var i = 0 ; i < num.length ; i++) {
		//Print("ÿc1" + num[i] + " ÿc:monsters at position ÿc;" + i); //doesn't count storm casters as of v0.8
		if(num[i] < firstnum)
			firstnum = num[i];
	}

	if(firstnum == num[0]) {
		safex = x;
		safey = y;
		NTM_MoveTo(me.areaid, x, y);
	}
	else if(firstnum == num[1]) {
		safex = x + plusx;
		safey = y;
		NTM_MoveTo(me.areaid, x + plusx, y);
	}
	else if(firstnum == num[2]) {
		safex = x - minusx;
		safey = y;
		NTM_MoveTo(me.areaid, x - minusx, y);
	}
	else if(firstnum == num[3]) {
		safex = x;
		safey = y + plusy;
		NTM_MoveTo(me.areaid, x, y + plusy);
	}
	else if(firstnum == num[4]) {
		safex = x;
		safey = y - minusy;
		NTM_MoveTo(me.areaid, x, y - minusy);
	}
}

function TD_KillMonster(classid)
{
	var _target;

	if(NTConfig_AttackSkill[1] < 1)
		return false;

	_target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);

	if(!_target)
		return false;

	if(_target.IsAttackable())
	{
		var _attackcount = 0;

		while(_attackcount < 300 && NTA_IsValidMonster(_target))
		{
			if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
				break;
			
			if((_attackcount%10) == 5)
				NTM_MoveTo(me.areaid, _target.x+5, _target.y);
			else if((_attackcount%10) == 0)
				NTM_MoveTo(me.areaid, _target.x, _target.y+5);
			
			_attackcount++;
		}
	}

	return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
Das ganze funktioniert so, dass der leaderchar (muss eine sorc sein wegen tele) die leecher über spezielle commands wie z.B. ".bo" steuert.
Allerdings is es bei dem script so, dass es nur eine siegelrush funktion gibt und ich aber möchte, dass das ganze cs gemacht wird.
Jetzt würden einige sagen, dass ich doch dann einfach das normale dia script nehmen sollte, aber ich möchte ja, dass am anfang alle chars an wp kommen und vom barb den bo bekommen.


Ich hab jetzt die lines zu finden, welche dafür verantwortlich sind, dass der leader ans wp geht, ".bo" schreibt und alle leecher ans wp kommen.
Wenn dann meine theorie stimmt muss ich das ganze nur an den anfang des normalen dia scriptes setzen und der diarun nimmt gewohnt seinen lauf.

Kann mir da jemand weiterhelfen und mir sagen ob schon was an meinem denkansatz nicht stimmt und ob dies überhaupt möglich is.
Würde auch ne sehr dicke belohnung in fg aussetzen für denjenigen, der es hinbekommt
12/08/2010 17:47 Muddy Waters#2
Verständnisfragen:
Die Sorc macht dann hinterher das CS alleine?
Den anderen Chars fehlt schließlich Teleport, oder sehe ich das falsch?

Warum lässt man die Bots über ein Filehandle kommunizieren, anstatt das direkt über den ingame Chat zu lösen?
(Ich habe bei meinem Rush Skript eine Kommunikation zwischen den Chars per Chat Event Handle umgesetzt und war überrascht, wie gut das funktioniert.)

Du möchtest also effektiv nur ein erweitertes standard D2NT Skript, bei dem sich die Chars zunächst am WP mit BO eindecken? Mehr nicht?

Fragen über Fragen, aber ich möchte erstmal das Problem richtig verstehen, bevor ich mir Gedanken dazu mache. ;)

Lg
Muddy
12/08/2010 18:07 FoGzone#3
Quote:
Originally Posted by Muddy_Waters View Post
Verständnisfragen:
Die Sorc macht dann hinterher das CS alleine?
Den anderen Chars fehlt schließlich Teleport, oder sehe ich das falsch?

Warum lässt man die Bots über ein Filehandle kommunizieren, anstatt das direkt über den ingame Chat zu lösen?
(Ich habe bei meinem Rush Skript eine Kommunikation zwischen den Chars per Chat Event Handle umgesetzt und war überrascht, wie gut das funktioniert.)

Du möchtest also effektiv nur ein erweitertes standard D2NT Skript, bei dem sich die Chars zunächst am WP mit BO eindecken? Mehr nicht?

Fragen über Fragen, aber ich möchte erstmal das Problem richtig verstehen, bevor ich mir Gedanken dazu mache. ;)

Lg
Muddy
Also es funktioniert so:
Alle chars kommen ans wp und der barb gibt bo (das steuert der leader indem er .bo schreibt).
Die sorc teleportiert an die siegel und macht ein tp - die restlichen chars joinen und cleanen das siegel. Anschließend gehen sie wieder in die stadt.
Die sorc geht zum nächsten siegel, macht wieder ein tp und das ganze beginnt von vorne.
Wann genau die anderen chars, also die helfer durch das tp kommen sollen, wird wiederum über die befehle .s1 .s2 .s3 .s4 .dia gesteurt, wenn ich das richtig auslesen konnte

was ich jetzt aber haben möchte is folgendes:
Wie im aktuellen script sollen alle chars am anfang ans wp kommen und der barb gibt allen bo. Die sorc telt anschließend an den stern hoch und macht ein tp, sodass der rest joinen und helfen kann. Die chars laufen dann alle zusammen (sorc telt ofc) und cleanen das gesammte cs ab dem star (wie es bei dem normalen diascript läuft)
12/08/2010 18:33 Muddy Waters#4
Quote:
Originally Posted by Knutschkugel View Post
Also es funktioniert so:
Alle chars kommen ans wp und der barb gibt bo (das steuert der leader indem er .bo schreibt).
Die sorc teleportiert an die siegel und macht ein tp - die restlichen chars joinen und cleanen das siegel. Anschließend gehen sie wieder in die stadt.
Die sorc geht zum nächsten siegel, macht wieder ein tp und das ganze beginnt von vorne.
Wann genau die anderen chars, also die helfer durch das tp kommen sollen, wird wiederum über die befehle .s1 .s2 .s3 .s4 .dia gesteurt, wenn ich das richtig auslesen konnte

was ich jetzt aber haben möchte is folgendes:
Wie im aktuellen script sollen alle chars am anfang ans wp kommen und der barb gibt allen bo. Die sorc telt anschließend an den stern hoch und macht ein tp, sodass der rest joinen und helfen kann. Die chars laufen dann alle zusammen (sorc telt ofc) und cleanen das gesammte cs ab dem star (wie es bei dem normalen diascript läuft)
Aus meiner Sicht erfordert das dann aber recht hohen Programmieraufwand, wenn man es richtig macht.
Du müsstest verschiedene feste Routen durch das CS definieren, auf denen sich die Chars bewegen und dazu Algorithmen entwickeln, die die optimale Bewegung auf diesen Pfaden ermöglichen, um einen Reibungslosen Ablauf ohne Festhängen zu ermöglichen.

Also mir wärs zuviel, aber vielleicht findet sich ja jemand mit dem nötigen Know-How, der dir das ganze entwickelt, wenn du es nicht gerade selber machen willst.
Ich stehe gerne bei kleineren Fragen zur Verfügung, aber das ganze entwickeln werde ich mit Sicherheit nicht, zuviel Arbeit und für mich uninteressant. ;)

Lg
Muddy
12/08/2010 18:51 FoGzone#5
wie wäre es denn mit folgendem (ich kenn mich leider mit den algrithmen absolut ned aus):

Man legt spezielle punkte fest, an die die chars laufen sollen und im umkreis dieser punkte sollen sie alles clean bzw auf dem weg dahin (ist das möglich?).
Das prob is dann natürlich, dass die seals immer an verschiedenen stellen sind, aber genau diese möglichen positionen haben wir ja schon aus dem normalen dia script gegeben. Also würde ich das so machen, dass die chars sich genau an diese stelle bewegen sollen, wenn es diese stelle nicht gibt an die andere mögliche stelle usw. (macht doch das dia script so oder lieg ich da falsch?)

Mich würd es sehr freuen, wenn du mir eventuell infos über diese algorithmen zukommen lassen kannst, also wie die aufgebaut sind und eventuell grobe grundkenntnisse
12/08/2010 19:11 Muddy Waters#6
Quote:
Originally Posted by Knutschkugel View Post
wie wäre es denn mit folgendem (ich kenn mich leider mit den algrithmen absolut ned aus):

Man legt spezielle punkte fest, an die die chars laufen sollen und im umkreis dieser punkte sollen sie alles clean bzw auf dem weg dahin (ist das möglich?).
Das prob is dann natürlich, dass die seals immer an verschiedenen stellen sind, aber genau diese möglichen positionen haben wir ja schon aus dem normalen dia script gegeben. Also würde ich das so machen, dass die chars sich genau an diese stelle bewegen sollen, wenn es diese stelle nicht gibt an die andere mögliche stelle usw. (macht doch das dia script so oder lieg ich da falsch?)

Mich würd es sehr freuen, wenn du mir eventuell infos über diese algorithmen zukommen lassen kannst, also wie die aufgebaut sind und eventuell grobe grundkenntnisse
Kannst ja mal einen Blick in meinen Grundlagen Guide werfen, dann hast du schonmal grobes Basiswissen.

Ansonsten empfehle ich einfach Dinge auszuprobieren und vor allen Dingen vorhandene vor allem auch die Standard Funktionen nachzuvollziehen nachzuvollziehen.
Da es keine anständige Referenz gibt, ist letzteres eigentlich zwingend erforderlich.

Als Erstlingswerk ist das durchaus anspruchsvoll, aber man wächst ja schließlich mit seinen Aufgaben. :D

Du kannst ja mal einen Blick in die NTTownMove library werfen, dort wird das in etwa so gemacht.

Wegen den Siegeln brauchst du dir auch keine Sorgen zu machen, es gibt schließlich nur zwei Varianten je Flügel, wobei sich genau sagen lässt, welche Variante aktuell vorhanden ist.
Abgesehen von dieser berechenbaren Abweichung, sowie einer Variatrion im Eingangsbereich, ist das CS ansonsten eine konstante Ebene, auch was etwaige ausgelesene Koordinaten angeht.

Das erlaubt es natürlich auch konstante Pfade einzubauen.

Aber damit das vom Verständnis her klappt, solltest du dich erstmal über Variablentypen, deren Geltungsbereiche, Funktionen sowie Objektorientierte Programmierung informieren. Ohne Vorkenntnisse ein ziemlicher Brocken, aber mit einem wachen Verstand und der Fähigkeit, logisch zu denken, machbar denke ich.

Und wenn dann Unklarheiten bestehen, frag einfach, die Programming Sektion ist schließlich für programmiertechnische Fragen da. ;)

Lg
Muddy
12/08/2010 19:21 FoGzone#7
hab schon öfters mal deinen guide bisschen durchgelesen, da ich schon vor einiger zeit mal anfangen wollte, aber es irgendwie verpennt hatte^^

dann schau ich mir das mal an.
Bis jetzt kann ich halt schon grobe zusammenhänge in einem script erkennen und weiß grob, welcher befehl für was steht etc

ich meld mich dann die tage mal wenn ich nciht mehr weiter komme^^
12/09/2010 03:22 Deutsche-Mafia#8
soll das dann so aussehen?

12/09/2010 10:40 FoGzone#9
das classic script von kolton sieht genau so aus^^
01/01/2011 17:48 RezChams#10
Ich wollte jetzt nicht extra nen Neuen Thread öffnen, deswegen das hier
[Only registered and activated users can see links. Click Here To Register...]

Der ersteller gibt einen weitern Pfad an:
[Only registered and activated users can see links. Click Here To Register...]
den ich aber nicht öffnen kann, kanns einer von euch???
Wenn ja was ist das?
01/01/2011 17:49 RezChams#11
Ich wollte jetzt nicht extra nen Neuen Thread öffnen, deswegen das hier
[Only registered and activated users can see links. Click Here To Register...]

Der ersteller gibt einen weitern Pfad an:
[Only registered and activated users can see links. Click Here To Register...]
den ich aber nicht öffnen kann, kanns einer von euch???
Wenn ja was ist das?