void CActionDungeonAddPoint::DoAction() { const int addPoint = GetValue(eProperty_Dungeon_AddPoint); if(0 < addPoint) DungeonMGR->AddPoint(GetChannelID(), addPoint); else if(0 > addPoint) DungeonMGR->SubtractPoint(GetChannelID(), abs(addPoint)); }
void CActionDungeonSwitchToggle::DoAction() { const WORD switchNum = (WORD)GetValue(eProperty_Dungeon_SwitchToggle); if(0 == switchNum) return; const BOOL toggle = ! DungeonMGR->GetSwitch(GetChannelID(), switchNum - 1); DungeonMGR->SetSwitch(GetChannelID(), switchNum - 1, toggle); }
void CActionDungeonSwitchOn::DoAction() { const WORD switchNum = (WORD)GetValue(eProperty_Dungeon_SwitchOn); if(0 == switchNum) return; // 해당 스위치가 On상태이면 처리할 필요가 없으므로 종료시킨다. int switchState = DungeonMGR->GetSwitch(GetChannelID(), switchNum - 1); if( 0 != switchState ) return; DungeonMGR->SetSwitch(GetChannelID(), switchNum - 1, TRUE); // 스위치로 NPC를 사용할 경우, 이펙트를 표시하여 스위치 On/Off를 표현한다. const WORD dwNpcIndex = (WORD)GetValue(eProperty_ActiveNpcId); if( 0 == dwNpcIndex || GetValue(eProperty_ObjectKind) != eObjectKind_Npc) return; const DWORD dwObjectIndex = DungeonMGR->GetNpcObjectIndex(GetChannelID(), dwNpcIndex); if( 0 == dwObjectIndex ) return; const WORD wEffectIndex = (WORD)GetValue(eProperty_EffectDescNum); for(DWORD objectIndex = GetHeadTarget(); objectIndex > 0; objectIndex = GetNextTarget()) { CObject* const object = g_pUserTable->FindUser(objectIndex); if(0 == object) { continue; } MSG_DWORD5 msg; msg.Category = MP_TRIGGER; msg.Protocol = MP_TRIGGER_ADDEFFECT_ACK; msg.dwObjectID = dwObjectIndex; msg.dwData1 = wEffectIndex; msg.dwData2 = GetValue(eProperty_EffectAddToMap); msg.dwData3 = GetValue(eProperty_PosX); msg.dwData4 = GetValue(eProperty_PosY); msg.dwData5 = GetValue(eProperty_PosZ); PACKEDDATA_OBJ->QuickSend( object, &msg, sizeof( msg ) ); } return ; }
void CActionDungeonSwitchNpcOff::DoAction() { const DWORD npcIndex = GetValue(eProperty_ActiveNpcId); if(0 == npcIndex) return; DungeonMGR->SetSwitchNpc(GetChannelID(), (WORD)npcIndex, FALSE); }
void CActionDungeonWarpOff::DoAction() { const DWORD warpIndex = GetValue(eProperty_Dungeon_WarpOff); if(0 == warpIndex) return; DungeonMGR->SetWarp(GetChannelID(), warpIndex, FALSE); }
bool cChannel::Parse(const char *s) { bool ok = true; if (*s == ':') { groupSep = true; if (*++s == '@' && *++s) { char *p = NULL; errno = 0; int n = strtol(s, &p, 10); if (!errno && p != s && n > 0) { number = n; s = p; } } name = strcpyrealloc(name, skipspace(s)); strreplace(name, '|', ':'); } else { groupSep = false; char *namebuf = NULL; char *sourcebuf = NULL; char *parambuf = NULL; char *vpidbuf = NULL; char *apidbuf = NULL; char *tpidbuf = NULL; char *caidbuf = NULL; int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid); if (fields >= 9) { if (fields == 9) { // allow reading of old format sid = atoi(caidbuf); delete caidbuf; caidbuf = NULL; if (sscanf(tpidbuf, "%d", &tpid) != 1) return false; caids[0] = tpid; caids[1] = 0; tpid = 0; } vpid = ppid = 0; vtype = 0; apids[0] = 0; atypes[0] = 0; dpids[0] = 0; dtypes[0] = 0; spids[0] = 0; ok = false; if (parambuf && sourcebuf && vpidbuf && apidbuf) { parameters = parambuf; ok = (source = cSource::FromString(sourcebuf)) >= 0; char *p; if ((p = strchr(vpidbuf, '=')) != NULL) { *p++ = 0; if (sscanf(p, "%d", &vtype) != 1) return false; } if ((p = strchr(vpidbuf, '+')) != NULL) { *p++ = 0; if (sscanf(p, "%d", &ppid) != 1) return false; } if (sscanf(vpidbuf, "%d", &vpid) != 1) return false; if (!ppid) ppid = vpid; if (vpid && !vtype) vtype = 2; // default is MPEG-2 char *dpidbuf = strchr(apidbuf, ';'); if (dpidbuf) *dpidbuf++ = 0; p = apidbuf; char *q; int NumApids = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumApids < MAXAPIDS) { atypes[NumApids] = 4; // backwards compatibility char *l = strchr(q, '='); if (l) { *l++ = 0; char *t = strchr(l, '@'); if (t) { *t++ = 0; atypes[NumApids] = strtol(t, NULL, 10); } strn0cpy(alangs[NumApids], l, MAXLANGCODE2); } else *alangs[NumApids] = 0; if ((apids[NumApids] = strtol(q, NULL, 10)) != 0) NumApids++; } else esyslog("ERROR: too many APIDs!"); // no need to set ok to 'false' p = NULL; } apids[NumApids] = 0; atypes[NumApids] = 0; if (dpidbuf) { char *p = dpidbuf; char *q; int NumDpids = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumDpids < MAXDPIDS) { dtypes[NumDpids] = SI::AC3DescriptorTag; // backwards compatibility char *l = strchr(q, '='); if (l) { *l++ = 0; char *t = strchr(l, '@'); if (t) { *t++ = 0; dtypes[NumDpids] = strtol(t, NULL, 10); } strn0cpy(dlangs[NumDpids], l, MAXLANGCODE2); } else *dlangs[NumDpids] = 0; if ((dpids[NumDpids] = strtol(q, NULL, 10)) != 0) NumDpids++; } else esyslog("ERROR: too many DPIDs!"); // no need to set ok to 'false' p = NULL; } dpids[NumDpids] = 0; dtypes[NumDpids] = 0; } int NumSpids = 0; if ((p = strchr(tpidbuf, ';')) != NULL) { *p++ = 0; char *q; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumSpids < MAXSPIDS) { char *l = strchr(q, '='); if (l) { *l++ = 0; strn0cpy(slangs[NumSpids], l, MAXLANGCODE2); } else *slangs[NumSpids] = 0; spids[NumSpids++] = strtol(q, NULL, 10); } else esyslog("ERROR: too many SPIDs!"); // no need to set ok to 'false' p = NULL; } spids[NumSpids] = 0; } if (sscanf(tpidbuf, "%d", &tpid) != 1) return false; if (caidbuf) { char *p = caidbuf; char *q; int NumCaIds = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumCaIds < MAXCAIDS) { caids[NumCaIds++] = strtol(q, NULL, 16) & 0xFFFF; if (NumCaIds == 1 && caids[0] <= CA_USER_MAX) break; } else esyslog("ERROR: too many CA ids!"); // no need to set ok to 'false' p = NULL; } caids[NumCaIds] = 0; } } strreplace(namebuf, '|', ':'); char *p = strchr(namebuf, ';'); if (p) { *p++ = 0; provider = strcpyrealloc(provider, p); } p = strrchr(namebuf, ','); // long name might contain a ',', so search for the rightmost one if (p) { *p++ = 0; shortName = strcpyrealloc(shortName, p); } name = strcpyrealloc(name, namebuf); free(parambuf); free(sourcebuf); free(vpidbuf); free(apidbuf); free(tpidbuf); free(caidbuf); free(namebuf); if (!GetChannelID().Valid()) { esyslog("ERROR: channel data results in invalid ID!"); return false; } } else return false; } return ok; }
void CActionDungeonSetBossMonster::DoAction() { DungeonMGR->SetBossMonster(GetChannelID()); }
bool cChannel::Parse(const char *s) { bool ok = true; if (*s == ':') { groupSep = true; if (*++s == '@' && *++s) { char *p = NULL; errno = 0; int n = strtol(s, &p, 10); if (!errno && p != s && n > 0) { number = n; s = p; } } name = strcpyrealloc(name, skipspace(s)); strreplace(name, '|', ':'); } else { groupSep = false; char *namebuf = NULL; char *sourcebuf = NULL; char *parambuf = NULL; char *vpidbuf = NULL; char *apidbuf = NULL; char *caidbuf = NULL; int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid); if (fields >= 9) { if (fields == 9) { // allow reading of old format sid = atoi(caidbuf); delete caidbuf; caidbuf = NULL; caids[0] = tpid; caids[1] = 0; tpid = 0; } vpid = ppid = 0; apids[0] = 0; dpids[0] = 0; ok = false; if (parambuf && sourcebuf && vpidbuf && apidbuf) { ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0; char *p = strchr(vpidbuf, '+'); if (p) *p++ = 0; if (sscanf(vpidbuf, "%d", &vpid) != 1) return false; if (p) { if (sscanf(p, "%d", &ppid) != 1) return false; } else ppid = vpid; char *dpidbuf = strchr(apidbuf, ';'); if (dpidbuf) *dpidbuf++ = 0; p = apidbuf; char *q; int NumApids = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumApids < MAXAPIDS) { char *l = strchr(q, '='); if (l) { *l++ = 0; strn0cpy(alangs[NumApids], l, MAXLANGCODE2); } else *alangs[NumApids] = 0; apids[NumApids++] = strtol(q, NULL, 10); } else esyslog("ERROR: too many APIDs!"); // no need to set ok to 'false' p = NULL; } apids[NumApids] = 0; if (dpidbuf) { char *p = dpidbuf; char *q; int NumDpids = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumDpids < MAXDPIDS) { char *l = strchr(q, '='); if (l) { *l++ = 0; strn0cpy(dlangs[NumDpids], l, MAXLANGCODE2); } else *dlangs[NumDpids] = 0; dpids[NumDpids++] = strtol(q, NULL, 10); } else esyslog("ERROR: too many DPIDs!"); // no need to set ok to 'false' p = NULL; } dpids[NumDpids] = 0; } if (caidbuf) { char *p = caidbuf; char *q; int NumCaIds = 0; char *strtok_next; while ((q = strtok_r(p, ",", &strtok_next)) != NULL) { if (NumCaIds < MAXCAIDS) { caids[NumCaIds++] = strtol(q, NULL, 16) & 0xFFFF; if (NumCaIds == 1 && caids[0] <= 0x00FF) break; } else esyslog("ERROR: too many CA ids!"); // no need to set ok to 'false' p = NULL; } caids[NumCaIds] = 0; } } strreplace(namebuf, '|', ':'); char *p = strchr(namebuf, ';'); if (p) { *p++ = 0; provider = strcpyrealloc(provider, p); } p = strchr(namebuf, ','); if (p) { *p++ = 0; shortName = strcpyrealloc(shortName, p); } name = strcpyrealloc(name, namebuf); free(parambuf); free(sourcebuf); free(vpidbuf); free(apidbuf); free(caidbuf); free(namebuf); if (!GetChannelID().Valid()) { esyslog("ERROR: channel data results in invalid ID!"); return false; } } else return false; } return ok; }