|
You last visited: Today at 16:36
Advertisement
SealBoss Problem im CS
Discussion on SealBoss Problem im CS within the Diablo 2 Programming forum part of the Diablo 2 category.
12/15/2012, 13:46
|
#1
|
elite*gold: 0
Join Date: Oct 2008
Posts: 216
Received Thanks: 47
|
SealBoss Problem im CS
Es geht natrlich um die Siegel Bosse im Chaos Sanktorium.
Ich versuche die Seal Funktionen so anzupassen, dass zuerst die Helferlein zumindest teilweise gekillt werden bevor er direkt auf den Boss geht.
Hintergrund is eine FO/FB/(Meteor) Sorc, die bei DeSeis naturlich sinnloserweise direkt versucht mit Fireball den Fürst zu killen. Dieser ist aber zu dem Zeitpunkt noch von all seinen Feuerimmunen umgegeben was somit meistens in einem wilden rumtelen inkl chicken endet.
Mit folgenden hab ich es versucht, aber unverständlicher weise geht er trotzdem noch direkt auf den Boss. Evtl kann mir hier jemand mit bissl Rat zur Seite stehen. Ist bestimmt nur ein dummer logik Fehler.
Code:
// siegel geöfffnet und char steht noch am siegel
var _monstername = GetLocaleString(2852);
for(var i = 0; i < 3; i++)
{
if(!NTC_FindUnit(NTC_UNIT_MONSTER, _monstername, 10)) // waits upto 2s
{
NTM_MoveTo(me.areaid, 7790, 5195, 3, !MWConfig_FastDia)
Print('not found / pushing to '+ _monstername);
continue;
}
Print('move clearing to ' + _monstername)
NTM_MoveToPresetUnit(me.areaid, NTC_UNIT_MONSTER, _monstername, 3, 3, !MWConfig_FastDia , 0x02|0x04|0x10)
if(NTA_KillMonster(_monstername))
{
Print('killed '+ _monstername)
NTA_ClearPosition((MWConfig_FastDia) ? 5 : CLEAR_RADIUS );
NTSI_PickItems();
return true;
}
}
|
|
|
12/15/2012, 19:28
|
#2
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Welche Werte haben MWConfig_KeepDistanceToMonsters und MWConfig_FastDia? Was genau passiert aus deiner Sicht in deinem Codeschnipsel?
|
|
|
12/15/2012, 22:27
|
#3
|
elite*gold: 0
Join Date: Oct 2008
Posts: 216
Received Thanks: 47
|
fastdia => false, keep distance => true
Aus meiner sicht sollte laufen:
-FindUnit blockt bis der Lord erscheint oder bis 2 sekunden vorbei sind ( 10 retrys zu 200ms)
-konnte der Lord dabei nicht entdeckt werden bewegt er sich bissl näher dran ( ohne fast dia cleared er den weg auch) und beginnt die schleife von vorne
wurde der Lord gefunden bewegt er sich dorthin und macht auf dem weg, sofern kein fastdia gesetzt ist, alles außer bossmonster platt
danach killt er speziell das boss monster und beendet die funktion erfolgreich
Anmerkung: die push position ist immer vom sealtyp unabhängig gewählt, beim lord eher die linke mitte vom mittleren wegbalken
ok, ich habs denk ich.
MoveToPresentUnit frisst nur classid´s, keine namenstrings, daher findet die funktion den lord nicht
|
|
|
12/16/2012, 13:46
|
#4
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Stimmt.
In jedem Fall solltest du dir sehr genau überlegen, ob du den Rückgabewert von NTA_KillMonster() auswertest, wenn du vorher bereits NTA_ClearPosition() aufrufst und damit vielleicht schon DeSeis erledigst. Es könnte dann unter Umständen vorkommen, dass NTA_KillMonster() false zurückgibt, wenn DeSeis bereits hinüber ist. Das müsste man mal testen, ich habe es nur so in Erinnerung, dass das durchaus Abbrüche zur Folge haben kann.
Statt dem NTM_MoveToPresetUnit() Aufruf solltest du den Rückgabewert von NTC_FindUnit() in einer lokalen Variable speichern. Danach kannst du dann mit NTM_MoveTo() arbeiten und die Position relativ zu den x,y-Koordinaten der Unit arbeiten.
|
|
|
12/16/2012, 14:11
|
#5
|
elite*gold: 0
Join Date: Oct 2008
Posts: 216
Received Thanks: 47
|
Danke für die Hilfe. Ich häng die neue Funktion gleich mal hinten an, scheint jetzt gut zu funktionieren.
Zu deiner Anmerkung:
Das hab ich auch schon bedacht, daher ja die Spectypes um das Risiko ein bisschen zu begrenzen. Mir ist auch aufgefallen das NTA_KillMonster() durchaus noch true zurückgibt, wenn das Monster bereits tot am Boden liegt. Nur wenn mit Eis, Redemtion oder sonstwie auch die Leiche schon weg ist gehts schief. (Wo gehobelt wird fallen halt auch mal Monster um)
Ich versuch das allerdings bereits anders in den Griff zu kriegen. Die SealOpen Funktionen öffnet das Seal mittlerweile schon immer im ersten Versuch ohne Probleme. (Distance 5 anstatt 3 vorm Click, und er läuft noch 1 Unit zum Seal bevor er klickt.) Damit kann ich mich zu nem bestimmten Zeitpunkt im Script drauf verlassen das die Seals erfolgreich geöffnet wurden. Wenn dann kein Lord zu finden ist, muss er da wohl schon tot sein.
Muss dazu sagen das ich die letzten WE´s versuche das Standard Diablo Script logisch komplett zu überarbeiten. Es lüppt schon sehr sehr schön , aber Kleinigkeiten sind halt immernoch übrig.
Code:
function NT_KillSealBoss( _monstername , pushx , pushy )
{
var unit;
for(var i = 0; i < 3; i++)
{
unit = NTC_FindUnit(NTC_UNIT_MONSTER, _monstername, 10)
if( ! unit )
{
NTM_MoveTo(me.areaid, pushx, pushy, 3, !MWConfig_FastDia)
continue;
}
if(!NTM_MoveTo(me.areaid, unit.x + 3, unit.y + 3, 3, !MWConfig_FastDia , 0x02|0x04|0x10))
continue;
if(NTA_KillMonster(_monstername))
{
NTA_ClearPosition((MWConfig_FastDia) ? 5 : CLEAR_RADIUS );
NTSI_PickItems();
return true;
}
}
return false;
}
|
|
|
12/16/2012, 14:28
|
#6
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Sieht gut aus, bis auf ein paar unbedeutende Kleinigkeiten.
Formale Parameter von Funktionen beginnen bei D2NT üblicherweise mit einem Kleinbuchstaben ohne Unterstrich. Lokale Variablen hingegen beginnen mit einem Unterstrich gefolgt von einem Kleinbuchstaben. Da man bei D2NT typischerweise nicht mit einer richtigen IDE arbeitet, welche die Geltungsbereiche der Variablen hervorhebt, empfehle ich an der Nomenklatur nach Möglichkeit festzuhalten, weil du damit eine bessere Lesbarkeit erreichst.
Weiterhin verstehe ich nicht, warum die beiden Bezeichner pushx und pushy mit "push" beginnen und nicht einfach nur x und y heißen.
|
|
|
12/16/2012, 14:55
|
#7
|
elite*gold: 0
Join Date: Oct 2008
Posts: 216
Received Thanks: 47
|
Das mit der Nomenklatur werd ich mir mal festhalten. Da hatt ich schon immer Probleme, dass ich mich an sowas nicht halte bzw. die Einheitlichkeit mir da erst gar nicht auffällt.
Zu Punkt 2) die heißen so weils es nicht die Position ist wo der Boss zu finden ist, sondern eine Position von der er besser gefunden werden kann. Also wohin er "geschupst" wird wenn er nix findet. Bei nur x,y würde ich selbst anhand der Bennenung wohl auch eher erwarten, dass er sich dorthin bewegt und dann versucht den Boss zu legen. Manchmal spannt der Haufen halt doch sehr weit weg vom Seal, kennen wir ja alle.
|
|
|
All times are GMT +1. The time now is 16:39.
|
|