You can subscribe to this list here.
| 2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(18) |
Oct
(11) |
Nov
(9) |
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 |
Jan
|
Feb
(6) |
Mar
|
Apr
(10) |
May
(38) |
Jun
(15) |
Jul
(32) |
Aug
|
Sep
(17) |
Oct
(11) |
Nov
|
Dec
(14) |
| 2006 |
Jan
(2) |
Feb
(5) |
Mar
(3) |
Apr
(2) |
May
(3) |
Jun
(7) |
Jul
|
Aug
|
Sep
(3) |
Oct
(2) |
Nov
(6) |
Dec
(3) |
| 2007 |
Jan
|
Feb
(17) |
Mar
(5) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2008 |
Jan
(11) |
Feb
|
Mar
|
Apr
(4) |
May
|
Jun
(6) |
Jul
|
Aug
|
Sep
(6) |
Oct
(4) |
Nov
(1) |
Dec
|
| 2009 |
Jan
(3) |
Feb
(2) |
Mar
(4) |
Apr
|
May
(4) |
Jun
(3) |
Jul
|
Aug
(5) |
Sep
(3) |
Oct
(2) |
Nov
|
Dec
(6) |
| 2010 |
Jan
|
Feb
(6) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2011 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2012 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
(8) |
Aug
|
Sep
(2) |
Oct
(2) |
Nov
(4) |
Dec
(5) |
| 2013 |
Jan
(2) |
Feb
|
Mar
(2) |
Apr
(2) |
May
(1) |
Jun
(2) |
Jul
(2) |
Aug
(2) |
Sep
|
Oct
(2) |
Nov
(2) |
Dec
(2) |
| 2014 |
Jan
(3) |
Feb
(2) |
Mar
(3) |
Apr
(4) |
May
(4) |
Jun
(3) |
Jul
(4) |
Aug
(5) |
Sep
|
Oct
(2) |
Nov
(5) |
Dec
(2) |
| 2015 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
(10) |
Dec
|
| 2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(4) |
Aug
(2) |
Sep
(2) |
Oct
(3) |
Nov
(4) |
Dec
(2) |
| 2017 |
Jan
(2) |
Feb
|
Mar
(2) |
Apr
(4) |
May
(2) |
Jun
(2) |
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(2) |
| 2018 |
Jan
(4) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(2) |
Jun
(2) |
Jul
(8) |
Aug
(2) |
Sep
(2) |
Oct
(2) |
Nov
(4) |
Dec
(6) |
| 2019 |
Jan
(2) |
Feb
(2) |
Mar
(2) |
Apr
(4) |
May
(2) |
Jun
(3) |
Jul
(3) |
Aug
(2) |
Sep
(2) |
Oct
(13) |
Nov
(6) |
Dec
(4) |
| 2020 |
Jan
(7) |
Feb
(7) |
Mar
(7) |
Apr
(8) |
May
(5) |
Jun
(3) |
Jul
(10) |
Aug
(4) |
Sep
|
Oct
(37) |
Nov
(30) |
Dec
(8) |
| 2021 |
Jan
(14) |
Feb
(9) |
Mar
(7) |
Apr
(17) |
May
(3) |
Jun
(10) |
Jul
(7) |
Aug
(3) |
Sep
(3) |
Oct
(4) |
Nov
(15) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(3) |
Mar
(3) |
Apr
(3) |
May
(3) |
Jun
(3) |
Jul
(3) |
Aug
(5) |
Sep
(6) |
Oct
(4) |
Nov
(34) |
Dec
(17) |
| 2023 |
Jan
(3) |
Feb
(3) |
Mar
(29) |
Apr
(2) |
May
(18) |
Jun
(12) |
Jul
(12) |
Aug
(2) |
Sep
(7) |
Oct
(2) |
Nov
(2) |
Dec
(2) |
| 2024 |
Jan
(2) |
Feb
(10) |
Mar
(17) |
Apr
(6) |
May
(3) |
Jun
(9) |
Jul
(22) |
Aug
(48) |
Sep
(3) |
Oct
(2) |
Nov
(2) |
Dec
(8) |
| 2025 |
Jan
(3) |
Feb
(2) |
Mar
(9) |
Apr
(7) |
May
(3) |
Jun
(3) |
Jul
(2) |
Aug
(2) |
Sep
(11) |
Oct
(6) |
Nov
(9) |
Dec
(4) |
| 2026 |
Jan
(5) |
Feb
(6) |
Mar
(3) |
Apr
(7) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <cn...@us...> - 2024-07-15 01:00:23
|
Revision: 1496
http://sourceforge.net/p/seq/svn/1496
Author: cn187
Date: 2024-07-15 01:00:22 +0000 (Mon, 15 Jul 2024)
Log Message:
-----------
Fix qt4 compile error
Modified Paths:
--------------
showeq/branches/cn187_devel/src/filtermgr.cpp
Modified: showeq/branches/cn187_devel/src/filtermgr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-15 00:29:11 UTC (rev 1495)
+++ showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-15 01:00:22 UTC (rev 1496)
@@ -988,9 +988,9 @@
// in the match, because we don't want to accidentally
// match a different field/value (especially with short
// field names like C or A.
- if (filterString.length() && filterString.back() == ' ')
+ if (filterString.length() && filterString.endsWith(" "))
{
- filterString = filterString.chopped(1);
+ filterString.chop(1);
filterString += "( | .* )";
}
else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-15 00:29:14
|
Revision: 1495
http://sourceforge.net/p/seq/svn/1495
Author: cn187
Date: 2024-07-15 00:29:11 +0000 (Mon, 15 Jul 2024)
Log Message:
-----------
Remove debug print
Modified Paths:
--------------
showeq/branches/cn187_devel/src/filtermgr.cpp
Modified: showeq/branches/cn187_devel/src/filtermgr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-15 00:26:20 UTC (rev 1494)
+++ showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-15 00:29:11 UTC (rev 1495)
@@ -954,7 +954,6 @@
{
if (!info_wildcard)
{
- seqInfo("%s not in map, setting info wildcard", subfield_name.toLatin1().data());
info_wildcard = true;
}
continue;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-15 00:26:23
|
Revision: 1494
http://sourceforge.net/p/seq/svn/1494
Author: cn187
Date: 2024-07-15 00:26:20 +0000 (Mon, 15 Jul 2024)
Log Message:
-----------
Fix up filter string logic for edge cases with equipment fields
Modified Paths:
--------------
showeq/branches/cn187_devel/src/filtermgr.cpp
Modified: showeq/branches/cn187_devel/src/filtermgr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-14 17:11:08 UTC (rev 1493)
+++ showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-15 00:26:20 UTC (rev 1494)
@@ -946,14 +946,16 @@
{
//info subfields need special handling
bool info_added = false;
+ bool info_wildcard = false;
for (int info_field = IFSF_Light; info_field < IFSF_Max; ++info_field)
{
QString subfield_name = InfoFilterStringFieldName[info_field];
if (!map->contains(subfield_name) || !(*map)[subfield_name].trimmed().length())
{
- if (has_first_match && !wildcard)
+ if (!info_wildcard)
{
- wildcard = true;
+ seqInfo("%s not in map, setting info wildcard", subfield_name.toLatin1().data());
+ info_wildcard = true;
}
continue;
}
@@ -961,24 +963,61 @@
QString value = (*map)[subfield_name];
value = value.trimmed();
- has_first_match = true;
if (!info_added)
{
- filterString += "Info:";
+ if (wildcard)
+ {
+ wildcard = false;
+ filterString += ".*:Info:";
+ }
+ else
+ {
+ filterString += "Info:";
+ }
info_added = true;
}
- if (wildcard)
+ if (info_wildcard)
{
- wildcard = false;
- filterString += ".*";
+ info_wildcard = false;
+ // we need to handle 2 cases here
+ // 1. match-field ignore-field match-field
+ // 2. match-field matchfield
+ // If we naively insert .* like we do elsewhere, we'll
+ // wind up with " .* " which will never match case 2.
+ // But we also don't want to just not include spaces
+ // in the match, because we don't want to accidentally
+ // match a different field/value (especially with short
+ // field names like C or A.
+ if (filterString.length() && filterString.back() == ' ')
+ {
+ filterString = filterString.chopped(1);
+ filterString += "( | .* )";
+ }
+ else
+ {
+ filterString += ".*";
+ }
}
+
filterString += subfield_name;
filterString += ":";
filterString += value;
filterString += " ";
}
- filterString += ":";
+ //end of Info loop, tidy up
+ if (info_added)
+ {
+ if (info_wildcard)
+ {
+ info_wildcard = false;
+ filterString += ".*:";
+ }
+ else
+ {
+ filterString += ":";
+ }
+ }
}
else
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-14 17:11:11
|
Revision: 1493
http://sourceforge.net/p/seq/svn/1493
Author: cn187
Date: 2024-07-14 17:11:08 +0000 (Sun, 14 Jul 2024)
Log Message:
-----------
Allow configuration of map line/location colors
Modified Paths:
--------------
showeq/branches/cn187_devel/src/Makefile.am
showeq/branches/cn187_devel/src/interface.cpp
showeq/branches/cn187_devel/src/interface.h
showeq/branches/cn187_devel/src/map.cpp
showeq/branches/cn187_devel/src/map.h
showeq/branches/cn187_devel/src/mapcore.cpp
showeq/branches/cn187_devel/src/mapcore.h
Added Paths:
-----------
showeq/branches/cn187_devel/src/mapcolors.h
Modified: showeq/branches/cn187_devel/src/Makefile.am
===================================================================
--- showeq/branches/cn187_devel/src/Makefile.am 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/Makefile.am 2024-07-14 17:11:08 UTC (rev 1493)
@@ -113,7 +113,7 @@
EXTRA_DIST = h2info.pl
-noinst_HEADERS = classes.h compass.h everquest.h interface.h main.h map.h filter.h vpacket.h editor.h packet.h packetcapture.h packetcommon.h packetformat.h packetstream.h packetfragment.h packetinfo.h races.h skills.h spells.h util.h experiencelog.h combatlog.h spawn.h spawnshell.h spawnlist.h spellshell.h spelllist.h languages.h weapons.h weapons1.h weapons27.h weapons28.h weapons29.h weapons2a.h weapons2b.h weapons2c.h weapons2d.h weapons2e.h weapons2f.h weapons30.h weapons4e.h decode.h cgiconv.h skilllist.h statlist.h deity.h player.h crctab.h filtermgr.h point.h pointarray.h mapcore.h category.h compassframe.h group.h guild.h fixpt.h netdiag.h zones.h logger.h xmlconv.h xmlpreferences.h seqwindow.h seqlistview.h zonemgr.h spawnmonitor.h spawnpointlist.h typenames.h spawnlistcommon.h spawnlist2.h datetimemgr.h spawnlog.h packetlog.h datalocationmgr.h eqstr.h messages.h messagefilter.h messagewindow.h messageshell.h terminal.h filteredspawnlog.h messagefilterdialog.h diagnosticmessages.h mapicon.h mapicondialog.h mapicondialog.ui filternotifications.h netstream.h guildshell.h guildlist.h bazaarlog.h message.h s_everquest.h staticspells.h packetcaptureprovider.h
+noinst_HEADERS = classes.h compass.h everquest.h interface.h main.h map.h filter.h vpacket.h editor.h packet.h packetcapture.h packetcommon.h packetformat.h packetstream.h packetfragment.h packetinfo.h races.h skills.h spells.h util.h experiencelog.h combatlog.h spawn.h spawnshell.h spawnlist.h spellshell.h spelllist.h languages.h weapons.h weapons1.h weapons27.h weapons28.h weapons29.h weapons2a.h weapons2b.h weapons2c.h weapons2d.h weapons2e.h weapons2f.h weapons30.h weapons4e.h decode.h cgiconv.h skilllist.h statlist.h deity.h player.h crctab.h filtermgr.h point.h pointarray.h mapcore.h category.h compassframe.h group.h guild.h fixpt.h netdiag.h zones.h logger.h xmlconv.h xmlpreferences.h seqwindow.h seqlistview.h zonemgr.h spawnmonitor.h spawnpointlist.h typenames.h spawnlistcommon.h spawnlist2.h datetimemgr.h spawnlog.h packetlog.h datalocationmgr.h eqstr.h messages.h messagefilter.h messagewindow.h messageshell.h terminal.h filteredspawnlog.h messagefilterdialog.h diagnosticmessages.h mapicon.h mapicondialog.h mapicondialog.ui filternotifications.h netstream.h guildshell.h guildlist.h bazaarlog.h message.h s_everquest.h staticspells.h packetcaptureprovider.h mapcolors.h
CLEANFILES = $(nodist_showeq_SOURCES)
Modified: showeq/branches/cn187_devel/src/interface.cpp
===================================================================
--- showeq/branches/cn187_devel/src/interface.cpp 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/interface.cpp 2024-07-14 17:11:08 UTC (rev 1493)
@@ -155,7 +155,8 @@
m_netDiag(0),
m_messageFilterDialog(0),
m_guildListWindow(0),
- m_deviceList(enumerateNetworkDevices())
+ m_deviceList(enumerateNetworkDevices()),
+ m_mapColorDialog(new MapColorDialog())
{
setObjectName(name);
setWindowFlags(Qt::Window);
@@ -1164,6 +1165,8 @@
pOptMenu->addMenu(conColorBaseMenu);
+ pOptMenu->addAction("Map Colors...", this, SLOT(select_opt_mapColors()));
+
m_action_opt_UseUpdateRadius = pOptMenu->addAction("Use EQ's Update Radius",
this, SLOT(toggle_opt_UseUpdateRadius()));
m_action_opt_UseUpdateRadius->setCheckable(true);
@@ -4671,6 +4674,11 @@
}
}
+void EQInterface::select_opt_mapColors()
+{
+ m_mapColorDialog->show();
+}
+
void EQInterface::setExp(uint32_t totalExp, uint32_t totalTick,
uint32_t minExpLevel, uint32_t maxExpLevel,
uint32_t tickExpLevel)
Modified: showeq/branches/cn187_devel/src/interface.h
===================================================================
--- showeq/branches/cn187_devel/src/interface.h 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/interface.h 2024-07-14 17:11:08 UTC (rev 1493)
@@ -43,6 +43,7 @@
#include "packetlog.h"
#include "message.h"
#include "messagefilter.h"
+#include "map.h"
//--------------------------------------------------
// forward declarations
@@ -266,6 +267,7 @@
void toggle_opt_RetardedCoords(bool enable);
void toggle_opt_SystimeSpawntime(bool enable);
void select_opt_conColorBase(QAction* con);
+ void select_opt_mapColors();
void toggle_view_SpawnList();
void toggle_view_SpawnList2();
void toggle_view_SpawnPointList();
@@ -503,6 +505,8 @@
QStringList m_StringList;
QDialog *dialogbox;
+ MapColorDialog* m_mapColorDialog;
+
bool m_isSkillListDocked;
bool m_isStatListDocked;
bool m_isMapDocked[maxNumMaps];
Modified: showeq/branches/cn187_devel/src/map.cpp
===================================================================
--- showeq/branches/cn187_devel/src/map.cpp 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/map.cpp 2024-07-14 17:11:08 UTC (rev 1493)
@@ -68,6 +68,8 @@
#include <QImageWriter>
#include <QMenu>
#include <QWidgetAction>
+#include <QGridLayout>
+#include <QCommonStyle>
#if 1 // ZBTEMP: Until we setup a better way to enter location name/color
#include <QInputDialog>
@@ -5668,7 +5670,127 @@
}
}
+MapColorDialog::MapColorDialog(QWidget* parent) : QDialog(parent)
+{
+ #define X(a,b) m_color_base_table[b] = a;
+ SEQMAP_COLOR_TABLE
+ #undef X
+ setWindowTitle("Map Colors");
+
+ loadUserColors();
+
+ QVBoxLayout* vbox = new QVBoxLayout(this);
+
+ QGridLayout* gridLayout = new QGridLayout();
+ vbox->addLayout(gridLayout);
+
+ int col = 0;
+ int row = 0;
+ for (int i = 0; i < SEQMAP_NUM_COLORS; ++i)
+ {
+ row = floor(i / 8);
+ col = i % 8;
+
+ m_color_pb[i] = new QPushButton(QString::number(i), this);
+ m_color_pb[i]->setStyle(new QCommonStyle());
+ m_color_pb[i]->setPalette(QPalette(QColor(m_color_user_table[i])));
+ m_color_pb[i]->setProperty("colorIndex", i);
+ connect(m_color_pb[i], SIGNAL(clicked()), this, SLOT(selectColor()));
+
+ gridLayout->addWidget(m_color_pb[i], row, col);
+ }
+
+ QHBoxLayout* hbox = new QHBoxLayout();
+ vbox->addItem(new QSpacerItem(20, 25));
+ vbox->addLayout(hbox);
+
+ QPushButton* resetButton = new QPushButton("Reset");
+ resetButton->setDefault(false);
+ resetButton->setAutoDefault(false);
+ hbox->addWidget(resetButton);
+ connect(resetButton, SIGNAL(clicked()), this, SLOT(resetDialog()));
+
+ QPushButton* defaultsButton = new QPushButton("Load Defaults");
+ defaultsButton->setDefault(false);
+ defaultsButton->setAutoDefault(false);
+ hbox->addWidget(defaultsButton);
+ connect(defaultsButton, SIGNAL(clicked()), this, SLOT(loadDefaults()));
+
+ hbox->addItem(new QSpacerItem(20, 1));
+
+ QPushButton* okButton = new QPushButton("Ok");
+ okButton->setDefault(false);
+ okButton->setAutoDefault(false);
+ hbox->addWidget(okButton);
+ connect(okButton, SIGNAL(clicked()), this, SLOT(acceptDialog()));
+
+ QPushButton* cancelButton = new QPushButton("Cancel");
+ okButton->setDefault(false);
+ okButton->setAutoDefault(false);
+ hbox->addWidget(cancelButton);
+ connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
+
+ setLayout(vbox);
+
+ resetDialog();
+}
+
+MapColorDialog::~MapColorDialog()
+{ }
+
+void MapColorDialog::resetDialog()
+{
+ loadUserColors();
+ for (int i=0; i<SEQMAP_NUM_COLORS; ++i)
+ m_color_pb[i]->setPalette(QPalette(QColor(m_color_user_table[i])));
+}
+
+void MapColorDialog::acceptDialog()
+{
+ updateUserColors();
+ done(QDialog::Accepted);
+}
+
+void MapColorDialog::loadDefaults()
+{
+ for (int i=0; i<SEQMAP_NUM_COLORS; ++i)
+ {
+ m_color_user_table[i] = m_color_base_table[i];
+ m_color_pb[i]->setPalette(QPalette(QColor(m_color_base_table[i])));
+ }
+}
+
+void MapColorDialog::loadUserColors()
+{
+ for (int i=0; i<SEQMAP_NUM_COLORS; ++i)
+ m_color_user_table[i] = pSEQPrefs->getPrefString("MapColor" + QString::number(i),
+ "MapColors", m_color_base_table[i]);
+}
+
+void MapColorDialog::updateUserColors()
+{
+ for (int i=0; i<SEQMAP_NUM_COLORS; ++i)
+ pSEQPrefs->setPrefString("MapColor" + QString::number(i), "MapColors", m_color_user_table[i]);
+}
+
+
+
+void MapColorDialog::selectColor()
+{
+ QPushButton* pb = qobject_cast<QPushButton*>(sender());
+ if (!pb) return;
+
+ QColor newColor = QColorDialog::getColor(pb->palette().color(backgroundRole()), this);
+ if (newColor.isValid())
+ {
+ int i = pb->property("colorIndex").toInt();
+ m_color_user_table[i] = newColor.name();
+ pb->setPalette(QPalette(QColor(m_color_user_table[i])));
+ }
+
+}
+
#ifndef QMAKEBUILD
#include "map.moc"
#endif
Modified: showeq/branches/cn187_devel/src/map.h
===================================================================
--- showeq/branches/cn187_devel/src/map.h 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/map.h 2024-07-14 17:11:08 UTC (rev 1493)
@@ -44,6 +44,7 @@
#include <QPen>
#include <QBrush>
#include <QElapsedTimer>
+#include <QPushButton>
// includes required for MapMenu
#include <QMenu>
@@ -69,6 +70,7 @@
#include "seqwindow.h"
#include "spawn.h"
#include "mapicon.h"
+#include "mapcolors.h"
//----------------------------------------------------------------------
// forward declarations
@@ -105,6 +107,8 @@
tFOVClassic = 2
};
+
+
//----------------------------------------------------------------------
// constants
const int maxFrameTimes = 40;
@@ -790,5 +794,29 @@
QAction* m_action_bottomControl_Options;
};
+class MapColorDialog : public QDialog
+{
+ Q_OBJECT
+
+ public:
+ MapColorDialog(QWidget* parent=0);
+ ~MapColorDialog();
+
+ private slots:
+ void selectColor();
+ void resetDialog();
+ void acceptDialog();
+ void loadDefaults();
+
+ private:
+ void loadUserColors();
+ void updateUserColors();
+
+ QString m_color_base_table[SEQMAP_NUM_COLORS];
+ QString m_color_user_table[SEQMAP_NUM_COLORS];
+ QPushButton* m_color_pb[SEQMAP_NUM_COLORS];
+
+};
+
#endif // _EQMAP_H_
Added: showeq/branches/cn187_devel/src/mapcolors.h
===================================================================
--- showeq/branches/cn187_devel/src/mapcolors.h (rev 0)
+++ showeq/branches/cn187_devel/src/mapcolors.h 2024-07-14 17:11:08 UTC (rev 1493)
@@ -0,0 +1,95 @@
+/*
+ * mapcolors.h
+ * Copyright 2024 by the respective ShowEQ Developers
+ *
+ * This file is part of ShowEQ.
+ * http://www.sourceforge.net/projects/seq
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+//colors used in SEQ maps, and after converting SOE maps.
+#ifndef SEQMAP_COLORS_H
+#define SEQMAP_COLORS_H
+
+#define SEQMAP_NUM_COLORS 64
+
+#define SEQMAP_COLOR_TABLE\
+ X("Black", 0) \
+ X("DarkRed", 1) \
+ X("FireBrick", 2) \
+ X("Red", 3) \
+ X("DarkGreen", 4) \
+ X("Orange", 5) \
+ X("DarkOrange", 6) \
+ X("DarkOrange", 7) \
+ X("Green", 8) \
+ X("Chartreuse", 9) \
+ X("Gold", 10) \
+ X("Gold", 11) \
+ X("Green", 12) \
+ X("Chartreuse", 13) \
+ X("Goldenrod", 14) \
+ X("Yellow", 15) \
+ X("DarkBlue", 16) \
+ X("Magenta", 17) \
+ X("DeepPink", 18) \
+ X("DeepPink", 19) \
+ X("DarkCyan", 20) \
+ X("Grey", 21) \
+ X("IndianRed", 22) \
+ X("LightCoral", 23) \
+ X("SpringGreen", 24) \
+ X("LightGreen", 25) \
+ X("DarkKhaki", 26) \
+ X("Khaki", 27) \
+ X("SpringGreen", 28) \
+ X("PaleGreen", 29) \
+ X("DarkOliveGreen",30) \
+ X("Khaki", 31) \
+ X("MediumBlue", 32) \
+ X("DarkViolet", 33) \
+ X("Magenta", 34) \
+ X("Maroon", 35) \
+ X("RoyalBlue", 36) \
+ X("SlateBlue", 37) \
+ X("Orchid", 38) \
+ X("HotPink", 39) \
+ X("Turquoise", 40) \
+ X("SkyBlue", 41) \
+ X("Snow", 42) \
+ X("LightPink", 43) \
+ X("Cyan", 44) \
+ X("Aquamarine", 45) \
+ X("DarkSeaGreen", 46) \
+ X("Beige", 47) \
+ X("Blue", 48) \
+ X("Purple", 49) \
+ X("Purple", 50) \
+ X("Magenta", 51) \
+ X("DodgerBlue", 52) \
+ X("SlateBlue", 53) \
+ X("MediumPurple", 54) \
+ X("Orchid", 55) \
+ X("DeepSkyBlue", 56) \
+ X("LightBlue", 57) \
+ X("Plum", 58) \
+ X("Cyan", 59) \
+ X("CadetBlue", 60) \
+ X("PaleTurquoise", 61) \
+ X("LightCyan", 62) \
+ X("White", 63)
+
+#endif
Modified: showeq/branches/cn187_devel/src/mapcore.cpp
===================================================================
--- showeq/branches/cn187_devel/src/mapcore.cpp 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/mapcore.cpp 2024-07-14 17:11:08 UTC (rev 1493)
@@ -53,7 +53,10 @@
#include <QPolygon>
#include <QByteArray>
#include <QPixmap>
+#include "xmlpreferences.h"
+extern XMLPreferences* pSEQPrefs;
+
//----------------------------------------------------------------------
// MapParameters
MapParameters::MapParameters(const MapData& mapData)
@@ -1110,7 +1113,10 @@
// create an M line (start with 2 points because of SOE's lame
// format).
- currentLineM = new MapLineM("soe", getMapConvertColor(r, g, b), 2);
+ unsigned short map_color_index = getMapConvertColorIndex(r, g, b);
+ QColor lineColor = pSEQPrefs->getPrefString("MapColor" + QString::number(map_color_index),
+ "MapColors", getMapConvertColor(r, g, b));
+ currentLineM = new MapLineM("soe", lineColor, 2);
currentLineM->setOrigColor(QColor(r, g, b));
// set the first point
@@ -1172,8 +1178,10 @@
name.replace("_", " ");
// add it to the list of locations
- MapLocation* loc = new MapLocation(name, getMapConvertColor(r, g, b),
- x1, y1, z1);
+ unsigned short map_color_index = getMapConvertColorIndex(r, g, b);
+ QColor lineColor = pSEQPrefs->getPrefString("MapColor" + QString::number(map_color_index),
+ "MapColors", getMapConvertColor(r, g, b));
+ MapLocation* loc = new MapLocation(name, lineColor, x1, y1, z1);
loc->setOrigColor(QColor(r, g, b));
layer->locations().append(loc);
Modified: showeq/branches/cn187_devel/src/mapcore.h
===================================================================
--- showeq/branches/cn187_devel/src/mapcore.h 2024-07-13 17:42:11 UTC (rev 1492)
+++ showeq/branches/cn187_devel/src/mapcore.h 2024-07-14 17:11:08 UTC (rev 1493)
@@ -48,6 +48,7 @@
#include <QList>
#include <QPolygon>
+#include "mapcolors.h"
#include "point.h"
#include "pointarray.h"
#include "fixpt.h"
@@ -732,6 +733,16 @@
(z >= floorRoom));
}
+inline unsigned short getMapConvertColorIndex(const unsigned short r, const unsigned short g,
+ const unsigned short b)
+{
+ unsigned short index = floor(r/80) + floor(g/80)*4 + floor(b/80)*16;
+ if (index == 0)
+ return 63;
+ else
+ return index;
+}
+
inline QString getMapConvertColor(const unsigned short r, const unsigned short g,
const unsigned short b)
{
@@ -739,70 +750,9 @@
//This adjusts the SOE map colors to colors that work for SEQs default color scheme
QString sColor[64] = {
- "Black", //0
- "DarkRed", //1
- "FireBrick", //2
- "Red", //3
- "DarkGreen", //4
- "Orange", //5
- "DarkOrange", //6
- "DarkOrange", //7
- "Green", //8
- "Chartreuse", //9
- "Gold", //10
- "Gold", //11
- "Green", //12
- "Chartreuse", //13
- "Goldenrod", //14
- "Yellow", //15
- "DarkBlue", //16
- "Magenta", //17
- "DeepPink", //18
- "DeepPink", //19
- "DarkCyan", //20
- "Grey", //21
- "IndianRed", //22
- "LightCoral", //23
- "SpringGreen", //24
- "LightGreen", //25
- "DarkKhaki", //26
- "Khaki", //27
- "SpringGreen", //28
- "PaleGreen", //29
- "DarkOliveGreen",//30
- "Khaki", //31
- "MediumBlue", //32
- "DarkViolet", //33
- "Magenta", //34
- "Maroon", //35
- "RoyalBlue", //36
- "SlateBlue", //37
- "Orchid", //38
- "HotPink", //39
- "Turquoise", //40
- "SkyBlue", //41
- "Snow", //42
- "LightPink", //43
- "Cyan", //44
- "Aquamarine", //45
- "DarkSeaGreen", //46
- "Beige", //47
- "Blue", //48
- "Purple", //49
- "Purple", //50
- "Magenta", //51
- "DodgerBlue", //52
- "SlateBlue", //53
- "MediumPurple", //54
- "Orchid", //55
- "DeepSkyBlue", //56
- "LightBlue", //57
- "Plum", //58
- "Cyan", //59
- "CadetBlue", //60
- "PaleTurquoise",//61
- "LightCyan", //62
- "White" //63
+ #define X(a,b) a,
+ SEQMAP_COLOR_TABLE
+ #undef X
};
unsigned short color = floor(r/80) + floor(g/80)*4 + floor(b/80)*16;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:42:13
|
Revision: 1492
http://sourceforge.net/p/seq/svn/1492
Author: cn187
Date: 2024-07-13 17:42:11 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Check pcap stats and report drops
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packetcapture.cpp
showeq/branches/cn187_devel/src/packetcapture.h
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-13 17:41:55 UTC (rev 1491)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-13 17:42:11 UTC (rev 1492)
@@ -35,7 +35,10 @@
#include "diagnosticmessages.h"
//#define PCAP_DEBUG 1
-
+
+unsigned int PacketCaptureThread::last_ps_ifdrop = 0;
+unsigned int PacketCaptureThread::last_ps_drop = 0;
+
//----------------------------------------------------------------------
// PacketCaptureThread
// start and stop the thread
@@ -45,8 +48,7 @@
m_playbackSpeed(0),
m_snaplen(snaplen),
m_buffersize(buffersize)
-{
-}
+{ }
PacketCaptureThread::~PacketCaptureThread()
{
@@ -55,7 +57,6 @@
// Turn off pcap
pcap_close(m_pcache_pcap);
}
-
}
void PacketCaptureThread::setPlaybackSpeed(int playbackSpeed)
@@ -335,6 +336,31 @@
}
pthread_mutex_unlock (&myThis->m_pcache_mutex);
+
+ struct pcap_stat ps = {0};
+
+ //NOTE: using fprintf here because seqWarn sends a MessageEntry, which
+ //can't cross thread boundaries using signals/slots without doing work
+ //to change MessageEntry to a proper Qt MetaType FIXME
+ pcap_stats(myThis->m_pcache_pcap, &ps);
+ if (ps.ps_ifdrop > 0 && ps.ps_ifdrop != last_ps_ifdrop)
+ {
+ fprintf(stderr, "PCAP detected %d packets dropped at the network interface! "
+ "This could cause ShowEQ to malfunction. Read FAQ #5 in the "
+ "FAQ located in the ShowEQ source directory for information "
+ "about tuning your kernel networking parameters.\n", ps.ps_ifdrop);
+ fprintf(stderr, "Packet loss due to dropping at the interface: %02f%%\n", (ps.ps_ifdrop * 1.0) / (ps.ps_recv * 1.0) * 100.0);
+ last_ps_ifdrop = ps.ps_ifdrop;
+ }
+
+ if (ps.ps_drop > 0 && ps.ps_drop != last_ps_drop)
+ {
+ fprintf(stderr, "PCAP detected %d packets dropped due to insufficent PCAP buffer size! "
+ "This could cause ShowEQ to malfunction. Increase the PCAP buffer "
+ "size and/or decrease the PCAP snapshot length.\n", ps.ps_drop);
+ fprintf(stderr, "Packet loss due to dropping at the PCAP buffer: %02f%%\n", (ps.ps_drop * 1.0) / (ps.ps_recv * 1.0) * 100.0);
+ last_ps_drop = ps.ps_drop;
+ }
}
void PacketCaptureThread::setFilter (const char *device,
Modified: showeq/branches/cn187_devel/src/packetcapture.h
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.h 2024-07-13 17:41:55 UTC (rev 1491)
+++ showeq/branches/cn187_devel/src/packetcapture.h 2024-07-13 17:42:11 UTC (rev 1492)
@@ -79,6 +79,8 @@
private:
static void* loop(void *param);
static void packetCallBack(u_char * param, const struct pcap_pkthdr *ph, const u_char *data);
+ static unsigned int last_ps_ifdrop;
+ static unsigned int last_ps_drop;
pcap_t *m_pcache_pcap;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:41:58
|
Revision: 1491
http://sourceforge.net/p/seq/svn/1491
Author: cn187
Date: 2024-07-13 17:41:55 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Allow configuration of PCAP snap len and buffer size
Modified Paths:
--------------
showeq/branches/cn187_devel/src/interface.cpp
showeq/branches/cn187_devel/src/interface.h
showeq/branches/cn187_devel/src/packet.cpp
showeq/branches/cn187_devel/src/packet.h
showeq/branches/cn187_devel/src/packetcapture.cpp
showeq/branches/cn187_devel/src/packetcapture.h
Modified: showeq/branches/cn187_devel/src/interface.cpp
===================================================================
--- showeq/branches/cn187_devel/src/interface.cpp 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/interface.cpp 2024-07-13 17:41:55 UTC (rev 1491)
@@ -240,7 +240,7 @@
if (!selected.isEmpty())
{
// set it as the device to monitor next session
- pSEQPrefs->setPrefString("Device", "Network", selected);
+ pSEQPrefs->setPrefString("Device", section, selected);
net_device = selected;
}
}
@@ -254,6 +254,8 @@
pSEQPrefs->getPrefString("MAC", section, "0"),
pSEQPrefs->getPrefBool("RealTimeThread", section,
false),
+ pSEQPrefs->getPrefInt("CaptureSnapLen", section, 1),
+ pSEQPrefs->getPrefInt("CaptureBufferSize", section, 2),
pSEQPrefs->getPrefBool("SessionTracking",
section, false),
pSEQPrefs->getPrefBool("Record", vpsection, false),
@@ -1189,6 +1191,41 @@
tmpAction->setCheckable(true);
tmpAction->setChecked(m_packet->realtime());
+ QMenu* captureMenu = new QMenu("Packet Capture Configuration");
+ m_netMenu->addMenu(captureMenu);
+
+
+ QWidgetAction* captureSettingNotice = new QWidgetAction(captureMenu);
+ QLabel* tmpLabel = new QLabel("NOTE: You must save preferences and restart ShowEQ for these changes to take effect (for now)");
+ tmpLabel->setWordWrap(true);
+ tmpLabel->setContentsMargins(30, 11, 11, 11);
+ captureSettingNotice->setDefaultWidget(tmpLabel);
+ captureMenu->addAction(captureSettingNotice);
+
+ captureMenu->addSeparator();
+
+ QMenu* tmpMenu = new QMenu("Snapshot Length (KB)");
+ QSpinBox* snapLenSpinBox = new QSpinBox(tmpMenu);
+ snapLenSpinBox->setMinimum(1);
+ snapLenSpinBox->setMaximum(64);
+ snapLenSpinBox->setValue(pSEQPrefs->getPrefInt("CaptureSnapLen", "Network", 1));
+ connect(snapLenSpinBox, SIGNAL(valueChanged(int)), this, SLOT(set_net_capture_snap_len(int)));
+ QWidgetAction* snapLenWidgetAction = new QWidgetAction(tmpMenu);
+ snapLenWidgetAction->setDefaultWidget(snapLenSpinBox);
+ tmpMenu->addAction(snapLenWidgetAction);
+ captureMenu->addMenu(tmpMenu);
+
+ tmpMenu = new QMenu("Capture Buffer Size (MB)");
+ QSpinBox* captureBufferSizeSpinBox = new QSpinBox();
+ captureBufferSizeSpinBox->setMinimum(2);
+ captureBufferSizeSpinBox->setMaximum(128);
+ captureBufferSizeSpinBox->setValue(pSEQPrefs->getPrefInt("CaptureBufferSize", "Network", 2));
+ connect(captureBufferSizeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(set_net_capture_buffer_size(int)));
+ QWidgetAction* captureBufferSizeWidgetAction = new QWidgetAction(tmpMenu);
+ captureBufferSizeWidgetAction->setDefaultWidget(captureBufferSizeSpinBox);
+ tmpMenu->addAction(captureBufferSizeWidgetAction);
+ captureMenu->addMenu(tmpMenu);
+
m_netMenu->addSeparator();
// Log menu
@@ -5318,6 +5355,18 @@
}
}
+void EQInterface::set_net_capture_snap_len(int len)
+{
+ m_packet->setSnapLen(len);
+ pSEQPrefs->setPrefInt("CaptureSnapLen", "Network", len);
+}
+
+void EQInterface::set_net_capture_buffer_size(int size)
+{
+ m_packet->setBufferSize(size);
+ pSEQPrefs->setPrefInt("CaptureBufferSize", "Network", size);
+}
+
void EQInterface::set_net_arq_giveup(int giveup)
{
// set the Arq Seq Give Up length
Modified: showeq/branches/cn187_devel/src/interface.h
===================================================================
--- showeq/branches/cn187_devel/src/interface.h 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/interface.h 2024-07-13 17:41:55 UTC (rev 1491)
@@ -223,6 +223,8 @@
void set_net_client_IP_address();
void set_net_client_MAC_address();
void set_net_device();
+ void set_net_capture_snap_len(int len);
+ void set_net_capture_buffer_size(int size);
void set_net_arq_giveup(int giveup);
virtual void setCaption(const QString&);
void restoreStatusFont();
Modified: showeq/branches/cn187_devel/src/packet.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packet.cpp 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/packet.cpp 2024-07-13 17:41:55 UTC (rev 1491)
@@ -92,6 +92,8 @@
QString ip,
QString mac_address,
bool realtime,
+ int snaplen,
+ int buffersize,
bool sessionTrackingFlag,
bool recordPackets,
int playbackPackets,
@@ -107,6 +109,8 @@
m_ip(ip),
m_mac(mac_address),
m_realtime(realtime),
+ m_snaplen(snaplen),
+ m_buffersize(buffersize),
m_session_tracking(sessionTrackingFlag),
m_recordPackets(recordPackets),
m_playbackPackets(playbackPackets),
@@ -193,7 +197,7 @@
if (m_playbackPackets == PLAYBACK_OFF)
{
// create the pcap object and initialize, either with MAC or IP
- m_packetCapture = new PacketCaptureThread();
+ m_packetCapture = new PacketCaptureThread(m_snaplen, m_buffersize);
if (m_mac.length() == 17)
{
seqInfo("Listening for client MAC: %s", m_mac.toLatin1().data());
@@ -218,7 +222,7 @@
else if (m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
{
// Create the pcap object and initialize with the file input given
- m_packetCapture = new PacketCaptureThread();
+ m_packetCapture = new PacketCaptureThread(m_snaplen, m_buffersize);
QString filename = pSEQPrefs->getPrefString("Filename", "VPacket");
Modified: showeq/branches/cn187_devel/src/packet.h
===================================================================
--- showeq/branches/cn187_devel/src/packet.h 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/packet.h 2024-07-13 17:41:55 UTC (rev 1491)
@@ -72,6 +72,8 @@
QString m_ip,
QString m_mac_address,
bool m_realtime,
+ int snaplen,
+ int buffersize,
bool m_session_tracking,
bool m_recordPackets,
int m_playbackPackets,
@@ -102,6 +104,10 @@
bool connect2(const QString& opcodeName, EQStreamPairs sp,
uint8_t dir, const char* payload, EQSizeCheckType szt,
const QObject* receiver, const char* member);
+ int snaplen(void) { return m_snaplen; }
+ int buffersize(void) { return m_buffersize; }
+ void setSnapLen(int len) { m_snaplen = len; }
+ void setBufferSize(int size) { m_buffersize = size; }
public slots:
void processPackets(void);
@@ -176,6 +182,8 @@
QString m_ip;
QString m_mac;
bool m_realtime;
+ int m_snaplen;
+ int m_buffersize;
bool m_session_tracking;
bool m_recordPackets;
int m_playbackPackets;
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-13 17:41:55 UTC (rev 1491)
@@ -40,9 +40,11 @@
// PacketCaptureThread
// start and stop the thread
// get packets to the processing engine(dispatchPacket)
-PacketCaptureThread::PacketCaptureThread() : PacketCaptureProviderThread(),
+PacketCaptureThread::PacketCaptureThread(int snaplen, int buffersize) : PacketCaptureProviderThread(),
m_pcache_pcap(NULL),
- m_playbackSpeed(0)
+ m_playbackSpeed(0),
+ m_snaplen(snaplen),
+ m_buffersize(buffersize)
{
}
@@ -81,7 +83,6 @@
bool realtime, uint8_t address_type)
{
char ebuf[PCAP_ERRBUF_SIZE]; // pcap error buffer
- char filter_buf[256]; // pcap filter buffer
seqInfo("Initializing Packet Capture Thread: ");
m_pcache_closed = false;
@@ -109,11 +110,8 @@
}
pcap_set_promisc(m_pcache_pcap, 1);
- //PCAP docs say 64K snaplen should be enough for most networks.
- pcap_set_snaplen(m_pcache_pcap, UINT16_MAX);
- // default buffer size is 2M: 2*1024*1024
- // but we can increase it in the future if needed
- //pcap_set_buffer_size(m_pcache_pcap, 4*1024*1024);
+ pcap_set_snaplen(m_pcache_pcap, m_snaplen*1024);
+ pcap_set_buffer_size(m_pcache_pcap, m_buffersize*1024*1024);
#ifndef __FreeBSD__
pcap_set_immediate_mode(m_pcache_pcap, 1);
Modified: showeq/branches/cn187_devel/src/packetcapture.h
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.h 2024-07-13 17:41:46 UTC (rev 1490)
+++ showeq/branches/cn187_devel/src/packetcapture.h 2024-07-13 17:41:55 UTC (rev 1491)
@@ -54,7 +54,7 @@
class PacketCaptureThread : public PacketCaptureProviderThread
{
public:
- PacketCaptureThread();
+ PacketCaptureThread(int snaplen, int buffersize);
~PacketCaptureThread();
bool offlinePlaybackSupported() { return true; }
@@ -88,6 +88,9 @@
int m_playbackSpeed; // -1=paused, 0=max, 1=1x speed, 2=2x speed, up to 9
timeval m_tvLastProcessedActual;
timeval m_tvLastProcessedOriginal;
+
+ int m_snaplen;
+ int m_buffersize;
};
#endif // _PACKETCAPTURE_H_
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:41:49
|
Revision: 1490
http://sourceforge.net/p/seq/svn/1490
Author: cn187
Date: 2024-07-13 17:41:46 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Update consider message
Modified Paths:
--------------
showeq/branches/cn187_devel/src/messageshell.cpp
Modified: showeq/branches/cn187_devel/src/messageshell.cpp
===================================================================
--- showeq/branches/cn187_devel/src/messageshell.cpp 2024-07-13 17:41:37 UTC (rev 1489)
+++ showeq/branches/cn187_devel/src/messageshell.cpp 2024-07-13 17:41:46 UTC (rev 1490)
@@ -1153,7 +1153,9 @@
// yes
deity = spawn->deityName();
- msg += item->name();
+ lvl = QString::number(spawn->level());
+
+ msg += item->name() + " (Lvl: " + lvl + ")";
} // end if spawn found
else
msg += "Spawn:" + QString::number(con->targetid, 16);
@@ -1162,9 +1164,13 @@
switch (con->level)
{
case 0:
+ case 5:
case 20:
msg += " (even)";
break;
+ case 1:
+ msg += " (grey)";
+ break;
case 2:
msg += " (green)";
break;
@@ -1171,12 +1177,15 @@
case 4:
msg += " (blue)";
break;
+ case 7:
case 13:
msg += " (red)";
break;
+ case 6:
case 15:
msg += " (yellow)";
break;
+ case 3:
case 18:
msg += " (cyan)";
break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:41:39
|
Revision: 1489
http://sourceforge.net/p/seq/svn/1489
Author: cn187
Date: 2024-07-13 17:41:37 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Stop selecting random mob after corpse disappears
Modified Paths:
--------------
showeq/branches/cn187_devel/src/interface.cpp
showeq/branches/cn187_devel/src/spawnlist.cpp
showeq/branches/cn187_devel/src/spawnlist2.cpp
Modified: showeq/branches/cn187_devel/src/interface.cpp
===================================================================
--- showeq/branches/cn187_devel/src/interface.cpp 2024-07-13 17:41:28 UTC (rev 1488)
+++ showeq/branches/cn187_devel/src/interface.cpp 2024-07-13 17:41:37 UTC (rev 1489)
@@ -5998,7 +5998,7 @@
{
m_spawnList2 = new SpawnListWindow2(m_player, m_spawnShell,
m_categoryMgr,
- 0, "spawnlist");
+ 0, "spawnlist2");
setDockEnabled(m_spawnList2,
pSEQPrefs->getPrefBool("DockableSpawnList2",
"Interface", true));
Modified: showeq/branches/cn187_devel/src/spawnlist.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnlist.cpp 2024-07-13 17:41:28 UTC (rev 1488)
+++ showeq/branches/cn187_devel/src/spawnlist.cpp 2024-07-13 17:41:37 UTC (rev 1489)
@@ -474,7 +474,7 @@
{
if (j == currentItem())
{
- selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::NoUpdate);
+ selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear);
clearSelection();
}
delList += j->takeChildren();
@@ -1070,7 +1070,11 @@
// the list is limited to one selection at a time, so we can take the first
SEQListViewItem* litem = selected.first();
- if (litem == NULL) return;
+ if (litem == NULL)
+ {
+ clearSelection();
+ return;
+ }
const Item* item = ((SpawnListItem*)litem)->item();
Modified: showeq/branches/cn187_devel/src/spawnlist2.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnlist2.cpp 2024-07-13 17:41:28 UTC (rev 1488)
+++ showeq/branches/cn187_devel/src/spawnlist2.cpp 2024-07-13 17:41:37 UTC (rev 1489)
@@ -76,7 +76,7 @@
// create the spawn list combo box
m_categoryCombo = new QComboBox(this);
- m_categoryCombo->setObjectName("spawnlistcombo");
+ m_categoryCombo->setObjectName("spawnlist2combo");
m_categoryCombo->setEditable(false);
m_categoryCombo->setDuplicatesEnabled(false);
hLayout->addWidget(m_categoryCombo, 0, Qt::AlignLeft);
@@ -108,7 +108,7 @@
// create the spawn listview
m_spawnList = new SEQListView(preferenceName(),
- this, "spawnlistview");
+ this, "spawnlist2view");
vLayout->addWidget(m_spawnList);
m_spawnList->addColumn ("Name");
@@ -245,7 +245,7 @@
}
m_menu = new SpawnListMenu(m_spawnList, this, m_spawnShell->filterMgr(),
- m_categoryMgr, this, "spawnlist menu");
+ m_categoryMgr, this, "spawnlist2 menu");
m_menu->addSeparator();
QAction* tmpAction;
@@ -292,8 +292,9 @@
if (item == m_selectedItem)
{
m_selectedItem = NULL;
- m_spawnList->selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::NoUpdate);
+ m_spawnList->selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear);
m_spawnList->clearSelection();
+ m_spawnList->setCurrentItem(NULL);
}
// delete the list item
@@ -418,7 +419,9 @@
if (!item)
{
m_selectedItem = NULL;
+ m_spawnList->selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear);
m_spawnList->clearSelection();
+ m_spawnList->setCurrentItem(NULL);
return;
}
@@ -798,7 +801,14 @@
// the list is limited to one selection at a time, so we can take the first
SEQListViewItem* litem = selected.first();
- if (litem == NULL) return;
+ if (litem == NULL)
+ {
+ m_selectedItem = NULL;
+ m_spawnList->selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear);
+ m_spawnList->clearSelection();
+ m_spawnList->setCurrentItem(NULL);
+ return;
+ }
m_selectedItem = ((SpawnListItem*)litem)->item();
@@ -913,7 +923,9 @@
if (!item)
{
m_selectedItem = NULL;
+ m_spawnList->selectionModel()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear);
m_spawnList->clearSelection();
+ m_spawnList->setCurrentItem(NULL);
return;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:41:31
|
Revision: 1488
http://sourceforge.net/p/seq/svn/1488
Author: cn187
Date: 2024-07-13 17:41:28 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Enable renaming/deleting spawn point items
Modified Paths:
--------------
showeq/branches/cn187_devel/src/spawnpointlist.cpp
Modified: showeq/branches/cn187_devel/src/spawnpointlist.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnpointlist.cpp 2024-07-13 17:41:21 UTC (rev 1487)
+++ showeq/branches/cn187_devel/src/spawnpointlist.cpp 2024-07-13 17:41:28 UTC (rev 1488)
@@ -247,8 +247,10 @@
// the list is limited to one selection at a time, so we can take the first
SEQListViewItem* item = selected.first();
+ m_menu->setCurrentItem((SpawnPointListItem*)item);
if (item == NULL) return;
+
const SpawnPoint* sp = NULL;
if ( item )
@@ -536,6 +538,8 @@
void SpawnPointListMenu::setCurrentItem(const SpawnPointListItem* item)
{
m_currentItem = item;
+ m_action_rename->setEnabled(m_currentItem != NULL);
+ m_action_delete->setEnabled(m_currentItem != NULL);
}
void SpawnPointListMenu::init_menu()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-13 17:41:23
|
Revision: 1487
http://sourceforge.net/p/seq/svn/1487
Author: cn187
Date: 2024-07-13 17:41:21 +0000 (Sat, 13 Jul 2024)
Log Message:
-----------
Formatted message fixes
Modified Paths:
--------------
showeq/branches/cn187_devel/src/eqstr.cpp
Modified: showeq/branches/cn187_devel/src/eqstr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/eqstr.cpp 2024-07-08 00:35:13 UTC (rev 1486)
+++ showeq/branches/cn187_devel/src/eqstr.cpp 2024-07-13 17:41:21 UTC (rev 1487)
@@ -239,9 +239,14 @@
// replace template argument with subst string
#if (QT_VERSION >= QT_VERSION_CHECK(5,5,0))
if (!substFormatStringRes.isEmpty())
- formatString.replace(curPos, match.capturedLength(1), substFormatStringRes);
+ {
+ formatString.replace(curPos-2, match.capturedLength(1)+2, substFormatStringRes);
+ }
else
+ {
+ formatString.replace(curPos-2, match.capturedLength(1)+2, "");
curPos = match.capturedEnd(1); // if no replacement string, skip over
+ }
// find next substitution
match = rxt.match(formatString, curPos);
@@ -248,9 +253,14 @@
curPos = match.capturedStart(1);
#else
if (!substFormatStringRes.isEmpty())
- formatString.replace(curPos, rxt.matchedLength(), substFormatStringRes);
+ {
+ formatString.replace(curPos-2, rxt.matchedLength()+2, substFormatStringRes);
+ }
else
+ {
+ formatString.replace(curPos-2, rxt.matchedLength()+2, "");
curPos += rxt.matchedLength(); // if no replacement string, skip over
+ }
// find next substitution
curPos = rxt.indexIn(formatString, curPos);
@@ -278,9 +288,24 @@
// replace substitution argument with argument from list
if (ok && (substArg <= argList.size()))
- formatString.replace(curPos, match.capturedLength(1), argList[substArg-1]);
+ {
+ QString sub = argList[substArg-1];
+ // some messages contains spell names with additional delimited fields
+ if (sub.contains('^'))
+ {
+ sub = sub.section("^", -1);
+ // they also contain an oddball apostrophe
+ if (sub.startsWith("'"))
+ sub.replace(0, 1, "");
+ }
+ formatString.replace(curPos-1, match.capturedLength(1)+1, sub);
+ }
else
+ {
+ //no argument for this replacement, so replace with empty string
+ formatString.replace(curPos-1, match.capturedLength(1)+1, "");
curPos = match.capturedEnd(1); // if no such argument, skip over
+ }
// find next substitution
match = rx.match(formatString, curPos);
@@ -290,9 +315,24 @@
// replace substitution argument with argument from list
if (ok && (substArg <= argList.size()))
- formatString.replace(curPos, rx.matchedLength(), argList[substArg-1]);
+ {
+ QString sub = argList[substArg-1];
+ // some messages contains spell names with additional delimited fields
+ if (sub.contains('^'))
+ {
+ sub = sub.section("^", -1);
+ // they also contain an oddball apostrophe
+ if (sub.startsWith("'"))
+ sub.replace(0, 1, "");
+ }
+ formatString.replace(curPos-1, rx.matchedLength()+1, argList[substArg-1]);
+ }
else
+ {
+ //no argument for this replacement, so replace with empty string
+ formatString.replace(curPos-1, rx.matchedLength()+1, "");
curPos += rx.matchedLength(); // if no such argument, skip over
+ }
// find next substitution
curPos = rx.indexIn(formatString, curPos);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-08 00:35:14
|
Revision: 1486
http://sourceforge.net/p/seq/svn/1486
Author: cn187
Date: 2024-07-08 00:35:13 +0000 (Mon, 08 Jul 2024)
Log Message:
-----------
Fix endianness issue in printed message
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packet.cpp
Modified: showeq/branches/cn187_devel/src/packet.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packet.cpp 2024-07-07 17:51:22 UTC (rev 1485)
+++ showeq/branches/cn187_devel/src/packet.cpp 2024-07-08 00:35:13 UTC (rev 1486)
@@ -742,7 +742,7 @@
m_clientPort = clientPort;
m_client_addr = clientAddr;
- in_addr ia = inet_makeaddr(m_client_addr, m_client_addr);
+ in_addr ia = inet_makeaddr(ntohl(m_client_addr), ntohl(m_client_addr));
if (m_playbackPackets == PLAYBACK_OFF ||
m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-07 17:51:25
|
Revision: 1485
http://sourceforge.net/p/seq/svn/1485
Author: cn187
Date: 2024-07-07 17:51:22 +0000 (Sun, 07 Jul 2024)
Log Message:
-----------
Add option to deselect target if mob is untargeted
Modified Paths:
--------------
showeq/branches/cn187_devel/src/interface.cpp
showeq/branches/cn187_devel/src/interface.h
showeq/branches/cn187_devel/src/map.cpp
showeq/branches/cn187_devel/src/spawnlist.cpp
showeq/branches/cn187_devel/src/spawnlist2.cpp
Modified: showeq/branches/cn187_devel/src/interface.cpp
===================================================================
--- showeq/branches/cn187_devel/src/interface.cpp 2024-07-06 18:56:38 UTC (rev 1484)
+++ showeq/branches/cn187_devel/src/interface.cpp 2024-07-07 17:51:22 UTC (rev 1485)
@@ -177,6 +177,7 @@
m_selectOnConsider = pSEQPrefs->getPrefBool("SelectOnCon", section, false);
m_selectOnTarget = pSEQPrefs->getPrefBool("SelectOnTarget", section, false);
+ m_deselectOnUntarget = pSEQPrefs->getPrefBool("DeselectOnUntarget", section, false);
const char* player_classes[] = {"Warrior", "Cleric", "Paladin", "Ranger",
"Shadow Knight", "Druid", "Monk", "Bard",
@@ -1023,6 +1024,12 @@
m_action_opt_TarSelect->setCheckable(true);
m_action_opt_TarSelect->setChecked(m_selectOnTarget);
+ m_action_opt_TarDeselect = pOptMenu->addAction("Deselect on Untarget?", this,
+ SLOT(toggle_opt_TarDeselect()));
+ m_action_opt_TarDeselect->setCheckable(true);
+ m_action_opt_TarDeselect->setChecked(m_deselectOnUntarget);
+
+
m_action_opt_KeepSelectedVisible = pOptMenu->addAction("Keep Selected Visible?",
this, SLOT(toggle_opt_KeepSelectedVisible()));
m_action_opt_KeepSelectedVisible->setCheckable(true);
@@ -3839,6 +3846,14 @@
}
void
+EQInterface::toggle_opt_TarDeselect (void)
+{
+ m_deselectOnUntarget = !(m_deselectOnUntarget);
+ m_action_opt_TarDeselect->setChecked(m_deselectOnUntarget);
+ pSEQPrefs->setPrefBool("DeselectOnUntarget", "Interface", m_deselectOnUntarget);
+}
+
+void
EQInterface::toggle_opt_Fast (void)
{
showeq_params->fast_machine = !(showeq_params->fast_machine);
@@ -4898,11 +4913,20 @@
void EQInterface::clientTarget(const uint8_t* data)
{
+
+ const clientTargetStruct* cts = (const clientTargetStruct*)data;
+
+ if (cts->newTarget == 0 && m_deselectOnUntarget)
+ {
+ m_selectedSpawn = 0;
+ emit selectSpawn(m_selectedSpawn);
+ updateSelectedSpawnStatus(m_selectedSpawn);
+ return;
+ }
+
if (!m_selectOnTarget)
return;
- const clientTargetStruct* cts = (const clientTargetStruct*)data;
-
// try to find the targeted spawn in the spawn shell
const Item* item = m_spawnShell->findID(tSpawn, cts->newTarget);
@@ -4922,9 +4946,6 @@
void EQInterface::spawnSelected(const Item* item)
{
- if (item == 0)
- return;
-
// note the new selection
m_selectedSpawn = item;
@@ -5007,7 +5028,10 @@
void EQInterface::updateSelectedSpawnStatus(const Item* item)
{
if (item == 0)
+ {
+ stsMessage("");
return;
+ }
const Spawn* spawn = 0;
Modified: showeq/branches/cn187_devel/src/interface.h
===================================================================
--- showeq/branches/cn187_devel/src/interface.h 2024-07-06 18:56:38 UTC (rev 1484)
+++ showeq/branches/cn187_devel/src/interface.h 2024-07-07 17:51:22 UTC (rev 1485)
@@ -253,6 +253,7 @@
void toggle_view_CombatWindow();
void toggle_opt_ConSelect();
void toggle_opt_TarSelect();
+ void toggle_opt_TarDeselect();
void toggle_opt_KeepSelectedVisible();
void toggle_opt_LogSpawns();
void toggle_opt_PvPTeams();
@@ -477,6 +478,7 @@
QAction* m_action_view_SpawnList_Cols[tSpawnColMaxCols];
QAction* m_action_opt_ConSelect;
QAction* m_action_opt_TarSelect;
+ QAction* m_action_opt_TarDeselect;
QAction* m_action_opt_KeepSelectedVisible;
QAction* m_action_opt_LogSpawns;
QAction* m_action_opt_PvPTeams;
@@ -511,6 +513,7 @@
bool m_selectOnConsider;
bool m_selectOnTarget;
+ bool m_deselectOnUntarget;
bool m_useUpdateRadius;
};
Modified: showeq/branches/cn187_devel/src/map.cpp
===================================================================
--- showeq/branches/cn187_devel/src/map.cpp 2024-07-06 18:56:38 UTC (rev 1484)
+++ showeq/branches/cn187_devel/src/map.cpp 2024-07-07 17:51:22 UTC (rev 1485)
@@ -4617,10 +4617,6 @@
void Map::selectSpawn(const Item* item)
{
- // sanity check
- if (item == NULL)
- return;
-
/* seqDebug("%s", item->ID()); */
m_selectedItem = item;
Modified: showeq/branches/cn187_devel/src/spawnlist.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnlist.cpp 2024-07-06 18:56:38 UTC (rev 1484)
+++ showeq/branches/cn187_devel/src/spawnlist.cpp 2024-07-07 17:51:22 UTC (rev 1485)
@@ -514,7 +514,10 @@
{
// seqDebug("SpawnList::selectSpawn(name=%s)", item->name().latin1());
if (item == NULL)
- return;
+ {
+ clearSelection();
+ return;
+ }
// start iterator at the beginning of this QListView
SEQListViewItemIterator it(this);
@@ -606,7 +609,7 @@
void SpawnList::setSelectedQuiet(SEQListViewItem* item, bool selected)
{
- if (!item || (item->isSelected() == selected ) ||
+ if ((item->isSelected() == selected ) ||
!(item->flags() & Qt::ItemIsSelectable))
return;
@@ -613,6 +616,12 @@
// get the old selection
SEQListViewItem *oldItem = currentItem();
+ if (!item)
+ {
+ clearSelection();
+ return;
+ }
+
// unselect the old selected item if any
if ((oldItem != item) && (oldItem != NULL) && (oldItem->isSelected()))
oldItem->setSelected(false);
Modified: showeq/branches/cn187_devel/src/spawnlist2.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnlist2.cpp 2024-07-06 18:56:38 UTC (rev 1484)
+++ showeq/branches/cn187_devel/src/spawnlist2.cpp 2024-07-07 17:51:22 UTC (rev 1485)
@@ -416,7 +416,11 @@
void SpawnListWindow2::selectSpawn(const Item *item)
{
if (!item)
+ {
+ m_selectedItem = NULL;
+ m_spawnList->clearSelection();
return;
+ }
// cache the selected item
m_selectedItem = item;
@@ -900,12 +904,19 @@
void SpawnListWindow2::setSelectedQuiet(SEQListViewItem* item, bool selected)
{
- if (!item || (item->isSelected() == selected) )
+ if (item->isSelected() == selected)
return;
// get the old selection
SEQListViewItem *oldItem = m_spawnList->currentItem();
+ if (!item)
+ {
+ m_selectedItem = NULL;
+ m_spawnList->clearSelection();
+ return;
+ }
+
// unselect the old selected item if any
if ((oldItem != item) && (oldItem != NULL) && (oldItem->isSelected()))
oldItem->setSelected(false);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-06 18:56:40
|
Revision: 1484
http://sourceforge.net/p/seq/svn/1484
Author: cn187
Date: 2024-07-06 18:56:38 +0000 (Sat, 06 Jul 2024)
Log Message:
-----------
Update pcap to use pcap_create/pcap_activate rather than pcap_open_live
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packetcapture.cpp
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-06 03:20:59 UTC (rev 1483)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-07-06 18:56:38 UTC (rev 1484)
@@ -86,28 +86,51 @@
seqInfo("Initializing Packet Capture Thread: ");
m_pcache_closed = false;
- /* A word about pcap_open_live() from the docs
- ** to_ms specifies the read timeout in milliseconds. The
- ** read timeout is used to arrange that the read not necessarily
- ** return immediately when a packet is seen, but that it wait
- ** for some amount of time to allow more packets to arrive and
- ** to read multiple packets from the OS kernel in one operation.
- ** Not all platforms support a read timeout; on platforms that
- ** don't, the read timeout is ignored.
- **
- ** In Linux 2.4.x with the to_ms set to 0 we got packets immediatly,
- ** and thats what we need in this application. However, as of libpcap
- ** 1.9.1, a timeout of 0 means infinity, so that no longer works. A
- ** negative timeout will use the default kernal timeout, which can
- ** vary. So the most prudent option is to set the timeout as low
- ** as we can, to 1 ms.
- **
- ** a race condition exists between this thread and the main thread
- ** any artificial delay in getting packets can cause filtering problems
- ** and cause us to miss new stream when the player zones.
+ /* We've replaced pcap_open_live() with pcap_create/pcap_activate.
+ * This allows us to use immedate mode, rather than approximating it with
+ * a 1ms timeout value.
+ *
+ * NOTE: a race condition exists between this thread and the main thread
+ * - any artificial delay in getting packets can cause filtering problems
+ * and cause us to miss new stream when the player zones.
*/
+
// initialize the pcap object
- m_pcache_pcap = pcap_open_live((char *) device, BUFSIZ, true, 1, ebuf);
+ m_pcache_pcap = pcap_create((const char*)device, ebuf);
+
+ if (!m_pcache_pcap)
+ {
+ seqFatal("pcap_error:pcap_create(%s): %s", device, ebuf);
+ if ((getuid() != 0) && (geteuid() != 0))
+ {
+ seqWarn("Make sure you are running ShowEQ as root.");
+ }
+ exit(1);
+ }
+
+ pcap_set_promisc(m_pcache_pcap, 1);
+ //PCAP docs say 64K snaplen should be enough for most networks.
+ pcap_set_snaplen(m_pcache_pcap, UINT16_MAX);
+ // default buffer size is 2M: 2*1024*1024
+ // but we can increase it in the future if needed
+ //pcap_set_buffer_size(m_pcache_pcap, 4*1024*1024);
+
+#ifndef __FreeBSD__
+ pcap_set_immediate_mode(m_pcache_pcap, 1);
+#endif
+
+ int act = pcap_activate(m_pcache_pcap);
+ if (act > 0)
+ {
+ seqWarn("pcap_warning:pcap_activate:%s", pcap_statustostr(act));
+ }
+ else if (act < 0)
+ {
+ seqFatal("pcap_error:pcap_activate:%s", pcap_statustostr(act));
+ pcap_close(m_pcache_pcap);
+ exit(1);
+ }
+
#ifdef __FreeBSD__
// if we're on FreeBSD, we need to call ioctl on the file descriptor
// with BIOCIMMEDIATE to get the kernel Berkeley Packet Filter device
@@ -117,7 +140,7 @@
// knows a less hacky way of doing this, I'd love to hear about it.
// the problem here is that libpcap doesn't expose an API to do this
// in any way
- int fd = *((int*)m_pcache_pcap);
+ int fd = pcap_fileno(m_pcache_pcap);
int temp = 1;
if ( ioctl( fd, BIOCIMMEDIATE, &temp ) < 0 )
{
@@ -124,15 +147,6 @@
seqWarn("PCAP couldn't set immediate mode on BSD" );
}
#endif
- if (!m_pcache_pcap)
- {
- seqWarn("pcap_error:pcap_open_live(%s): %s", device, ebuf);
- if ((getuid() != 0) && (geteuid() != 0))
- {
- seqWarn("Make sure you are running ShowEQ as root.");
- }
- exit(0);
- }
m_pcache_first = m_pcache_last = NULL;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-06 03:21:00
|
Revision: 1483
http://sourceforge.net/p/seq/svn/1483
Author: cn187
Date: 2024-07-06 03:20:59 +0000 (Sat, 06 Jul 2024)
Log Message:
-----------
Fix for entity fix fix
Modified Paths:
--------------
showeq/branches/cn187_devel/src/spawnshell.cpp
Modified: showeq/branches/cn187_devel/src/spawnshell.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnshell.cpp 2024-07-05 23:41:20 UTC (rev 1482)
+++ showeq/branches/cn187_devel/src/spawnshell.cpp 2024-07-06 03:20:59 UTC (rev 1483)
@@ -1696,17 +1696,18 @@
void SpawnShell::playerChangedID(uint16_t oldPlayerID, uint16_t newPlayerID)
{
// remove the player from the list (if it had a 0 id)
- m_players.take(0);
+ deleteItem(tPlayer, 0);
- Item* old = m_players.take(oldPlayerID);
- if (old != m_player)
- delete old;
+ if (oldPlayerID == newPlayerID)
+ return;
- //if the new ID already exists (sometimes as an unknown spawn) remove it
- Item* existing = m_players.take(newPlayerID);
- if (existing != m_player)
- delete existing;
+ //remove the old player
+ deleteItem(tPlayer, oldPlayerID);
+
+ //if the new ID already exists an unknown spawn
+ deleteItem(tSpawn, newPlayerID);
+
// re-insert the player into the list
m_players.insert(newPlayerID, m_player);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-05 23:41:24
|
Revision: 1482
http://sourceforge.net/p/seq/svn/1482
Author: cn187
Date: 2024-07-05 23:41:20 +0000 (Fri, 05 Jul 2024)
Log Message:
-----------
AddFilter Toggle All should cycle partial->unchecked->checked
Modified Paths:
--------------
showeq/branches/cn187_devel/src/filtermgr.cpp
showeq/branches/cn187_devel/src/filtermgr.h
Modified: showeq/branches/cn187_devel/src/filtermgr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-05 21:11:38 UTC (rev 1481)
+++ showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-05 23:41:20 UTC (rev 1482)
@@ -404,7 +404,23 @@
m_edit->blockSignals(old_edit_state);
}
+void ToggleAllCheckBox::nextCheckState()
+{
+ switch(checkState())
+ {
+ case Qt::Unchecked:
+ setCheckState(Qt::Checked);
+ break;
+ case Qt::PartiallyChecked:
+ setCheckState(Qt::Unchecked);
+ break;
+ case Qt::Checked:
+ setCheckState(Qt::Unchecked);
+ break;
+ }
+}
+
FilterDialog::FilterDialog(QWidget* parent, Qt::WindowFlags flags) :
QDialog(parent, flags),
m_toggleAll(nullptr),
@@ -463,7 +479,7 @@
//using an extra widget so the spacing lines up
QWidget* toggleAllWidget = new QWidget();
QHBoxLayout* toggleAllLayout = new QHBoxLayout(toggleAllWidget);
- m_toggleAll = new QCheckBox();
+ m_toggleAll = new ToggleAllCheckBox();
m_toggleAll->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
m_toggleAll->setTristate(true);
toggleAllLayout->addWidget(m_toggleAll);
Modified: showeq/branches/cn187_devel/src/filtermgr.h
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.h 2024-07-05 21:11:38 UTC (rev 1481)
+++ showeq/branches/cn187_devel/src/filtermgr.h 2024-07-05 23:41:20 UTC (rev 1482)
@@ -222,7 +222,16 @@
void stateChanged(int state);
};
+//SubClassing QCheckBox so we can control the sequence of check/uncheck/partial when
+//clicking "Toggle All"
+class ToggleAllCheckBox : public QCheckBox
+{
+ protected:
+ virtual void nextCheckState() override;
+};
+
+
class FilterDialog : public QDialog
{
Q_OBJECT
@@ -242,7 +251,7 @@
void createForm();
QHash<QString, FilterFormField*> m_filterFields;
- QCheckBox* m_toggleAll;
+ ToggleAllCheckBox* m_toggleAll;
QString m_spawnFilterString;
FilterFieldMap m_spawnFilterMap;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-05 21:11:41
|
Revision: 1481
http://sourceforge.net/p/seq/svn/1481
Author: cn187
Date: 2024-07-05 21:11:38 +0000 (Fri, 05 Jul 2024)
Log Message:
-----------
Add info/equipment support to filters
Modified Paths:
--------------
showeq/branches/cn187_devel/src/filtermgr.cpp
showeq/branches/cn187_devel/src/filtermgr.h
showeq/branches/cn187_devel/src/spawn.cpp
Modified: showeq/branches/cn187_devel/src/filtermgr.cpp
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-04 22:21:12 UTC (rev 1480)
+++ showeq/branches/cn187_devel/src/filtermgr.cpp 2024-07-05 21:11:38 UTC (rev 1481)
@@ -54,6 +54,11 @@
};
#undef X
+#define X(a, b) b,
+const QString InfoFilterStringFieldName[] = {
+ INFOFILTERSTRINGFIELD_TABLE
+};
+
//----------------------------------------------------------------------
// FilterMgr
FilterMgr::FilterMgr(const DataLocationMgr* dataLocMgr,
@@ -410,9 +415,17 @@
//init m_spawnFilterMap
for (int field = FSF_Name; field < FSF_Max; ++field)
{
+ if (field == FSF_Info) continue;
+
QString name = FilterStringFieldName[field];
m_spawnFilterMap[name] = "";
}
+ //starting with Head since Light is handled above
+ for (int field = IFSF_Head; field < IFSF_Max; ++field)
+ {
+ QString name = InfoFilterStringFieldName[field];
+ m_spawnFilterMap[name] = "";
+ }
m_spawnFilterMap[FSF_MINLEVEL_NAME] = "";
m_spawnFilterMap[FSF_MAXLEVEL_NAME] = "";
@@ -462,10 +475,12 @@
const QString labels[] = {
"Name", "Level", "Race", "Class", "NPC", "X", "Y", "Z", "Light", "Deity",
- "Race Team", "Deity Team", "Type", "Last Name", "Guild", "Spawn Time", "GM" };
+ "Race Team", "Deity Team", "Type", "Last Name", "Guild", "Spawn Time", "Info", "GM" };
for (int field = FSF_Name; field < FSF_Max; ++field)
{
+ if (field == FSF_Info) continue;
+
QString name = FilterStringFieldName[field];
QString label = labels[field];
m_filterFields[name] = new FilterFormField(name, label);
@@ -473,6 +488,19 @@
}
+ const QString info_labels[] = {
+ "Light", "Head", "Chest", "Arms", "Waist", "Gloves", "Legs", "Feet",
+ "Primary", "Secondary" };
+
+ // Starting with head, since Light is already created above.
+ for (int field = IFSF_Head; field < IFSF_Max; ++field)
+ {
+ QString name = InfoFilterStringFieldName[field];
+ QString label = info_labels[field];
+ m_filterFields[name] = new FilterFormField(name, label);
+ m_fieldCount++;
+ }
+
//not part of normal regex string, but still part of filter
m_filterFields[FSF_MINLEVEL_NAME] = new FilterFormField(FSF_MINLEVEL_NAME, FSF_MINLEVEL_LABEL);
m_filterFields[FSF_MAXLEVEL_NAME] = new FilterFormField(FSF_MAXLEVEL_NAME, FSF_MAXLEVEL_LABEL);
@@ -480,7 +508,9 @@
const QString formFieldOrder[] = { "Name", "LastName", "Guild", "Race", "Class",
"Deity", "Level", FSF_MINLEVEL_NAME, FSF_MAXLEVEL_NAME, "X", "Y", "Z", "NPC", "Type",
- "GM", "RTeam", "DTeam", "Spawn", "Light" };
+ "GM", "RTeam", "DTeam", "Spawn", "Light",
+ //Info fields
+ "H", "C", "A", "W", "G", "L", "F", "1", "2" };
int row = 1; //toggle all is row 0
int col = 0;
@@ -493,7 +523,9 @@
if (fieldname == "Guild" || fieldname == "Deity" ||
fieldname == FSF_MAXLEVEL_NAME || fieldname == "Z" ||
- fieldname == "GM" || fieldname == "Spawn")
+ fieldname == "GM" || fieldname == "Spawn" ||
+ fieldname == "Light" ||
+ fieldname == "A" || fieldname == "L")
{
row++;
col = 0;
@@ -540,7 +572,10 @@
m_fieldsCheckedCount = 0;
for (int field = FSF_Name; field < FSF_Max; ++field)
{
+ if (field == FSF_Info) continue;
+
QString name = FilterStringFieldName[field];
+
m_filterFields[name]->m_edit->setText(m_spawnFilterMap[name]);
if (m_filterFields[name]->m_edit->text().length())
@@ -553,6 +588,24 @@
m_filterFields[name]->stateChanged(Qt::Unchecked);
}
}
+
+ //starting with Head, since Light was handled above
+ for (int field = IFSF_Head; field < IFSF_Max; ++field)
+ {
+ QString name = InfoFilterStringFieldName[field];
+ m_filterFields[name]->m_edit->setText(m_spawnFilterMap[name]);
+
+ if (m_filterFields[name]->m_edit->text().length())
+ {
+ m_filterFields[name]->stateChanged(Qt::Checked);
+ m_fieldsCheckedCount++;
+ }
+ else
+ {
+ m_filterFields[name]->stateChanged(Qt::Unchecked);
+ }
+ }
+
//not part of normal regex string, but still part of filter
m_filterFields[FSF_MINLEVEL_NAME]->m_edit->setText(m_spawnFilterMap[FSF_MINLEVEL_NAME]);
if (m_filterFields[FSF_MINLEVEL_NAME]->m_edit->text().length())
@@ -593,10 +646,19 @@
//if enabled, add to map
for (int field = FSF_Name; field < FSF_Max; ++field)
{
+ if (field == FSF_Info) continue;
+
QString name = FilterStringFieldName[field];
if (m_filterFields[name]->m_edit->isEnabled())
map[name] = m_filterFields[name]->m_edit->text();
}
+ //starting with Head since Light is handled above
+ for (int field = IFSF_Head; field < IFSF_Max; ++field)
+ {
+ QString name = InfoFilterStringFieldName[field];
+ if (m_filterFields[name]->m_edit->isEnabled())
+ map[name] = m_filterFields[name]->m_edit->text();
+ }
//not part of normal regex string, but still part of filter
if (m_filterFields[FSF_MINLEVEL_NAME]->m_edit->isEnabled())
map[FSF_MINLEVEL_NAME] = m_filterFields[FSF_MINLEVEL_NAME]->m_edit->text();
@@ -751,17 +813,8 @@
//process filter string and set form fields
QStringList tokens = regex.split(":");
- //fields should be key:value, but split will create an extra item in the
- //list after the last :, so for a well-formed filterString, there should
- //always be an odd number of elements
- if (tokens.length() % 2 != 1)
- {
- seqWarn("Malformed filterString regex: %s", regex.toLatin1().data());
- return;
- }
-
QStringList::const_iterator itr = tokens.begin();
- for (;itr < tokens.end(); ++itr)
+ for (; itr < tokens.end(); ++itr)
{
QString name = *itr;
if (!map->contains(name))
@@ -772,29 +825,84 @@
continue;
}
- seqWarn("Ignoring unknown filter string field: %s", name.toLatin1().data());
- ++itr; // skip this field's data
- continue;
+ // Info isn't in the map, but we need to process it
+ // otherwise, skip any unknown fields
+ if (name != "Info")
+ {
+ seqWarn("Ignoring unknown filter string field: %s", name.toLatin1().data());
+ ++itr; // skip this field's data
+ continue;
+ }
}
+ // get field data
if (++itr == tokens.end())
+ break;
+ QString value = *itr;
+ if (!value.trimmed().length())
continue;
- QString value = *itr;
if (name == "Name" && (value == "Door" || value == "Drop"))
{
- //infuriatingly, we add a colon to door and drop names.
- //TODO try to find out how many people's filters this will break
- //if we remove the : from door and drop names (maybe replace it with
- //a - or something. Or save it for 7.x and do it anyway.
- //TODO also, check on adding trailing : to Item spawn filterstring
- //to make it consistent with the Spawn filterstring
+ //we add a colon to door and drop names, so it makes
+ //parsing a little more complicated.
value += ":";
if (++itr == tokens.end())
+ break;
+ value += *itr;
+ if (value.trimmed().length() <= 1)
continue;
- value += *itr;
}
- (*map)[name] = value.trimmed();
+ if (name == "Info")
+ {
+ //Info field contains space-separated slot:item pairs, and the
+ //items themselves can also contain spaces. So special parsing
+ //is needed.
+ bool info_done = false;
+ QString subfield_name = value;
+ while (itr != tokens.end() && !info_done)
+ {
+ // Check the name against valid sub-fields, because we could
+ // be past the Info field and into the next main field
+ bool is_info_field = false;
+ for (int field = IFSF_Light; field < IFSF_Max; ++field)
+ {
+ if (subfield_name == InfoFilterStringFieldName[field])
+ {
+ is_info_field = true;
+ break;
+ }
+ }
+
+ if (!is_info_field)
+ {
+ info_done = true;
+ continue;
+ }
+
+ // get value
+ if (++itr == tokens.end())
+ break;
+ value = *itr;
+ if (!value.trimmed().length())
+ continue;
+
+ QString next_subfield_name = value.section(" ", -1);
+ value = value.section(" ", 0, -2);
+
+ (*map)[subfield_name] = value.trimmed();
+
+ subfield_name = next_subfield_name;
+
+ }
+
+ if (itr == tokens.end())
+ break;
+ }
+ else
+ {
+ (*map)[name] = value.trimmed();
+ }
}
if (minLevel > -1)
@@ -818,30 +926,71 @@
{
QString name = FilterStringFieldName[field];
- if (!map->contains(name) || !(*map)[name].trimmed().length())
+ if (name == "Info")
{
- if (has_first_match && !wildcard)
+ //info subfields need special handling
+ bool info_added = false;
+ for (int info_field = IFSF_Light; info_field < IFSF_Max; ++info_field)
{
- wildcard = true;
+ QString subfield_name = InfoFilterStringFieldName[info_field];
+ if (!map->contains(subfield_name) || !(*map)[subfield_name].trimmed().length())
+ {
+ if (has_first_match && !wildcard)
+ {
+ wildcard = true;
+ }
+ continue;
+ }
+
+ QString value = (*map)[subfield_name];
+ value = value.trimmed();
+
+ has_first_match = true;
+ if (!info_added)
+ {
+ filterString += "Info:";
+ info_added = true;
+ }
+
+ if (wildcard)
+ {
+ wildcard = false;
+ filterString += ".*";
+ }
+ filterString += subfield_name;
+ filterString += ":";
+ filterString += value;
+ filterString += " ";
}
- continue;
+ filterString += ":";
}
+ else
+ {
+ if (!map->contains(name) || !(*map)[name].trimmed().length())
+ {
+ if (has_first_match && !wildcard)
+ {
+ wildcard = true;
+ }
+ continue;
+ }
- QString value = (*map)[name];
- value = value.trimmed();
+ QString value = (*map)[name];
+ value = value.trimmed();
- has_first_match = true;
+ has_first_match = true;
- if (wildcard)
- {
- wildcard = false;
- filterString += ".*:";
+ if (wildcard)
+ {
+ wildcard = false;
+ filterString += ".*:";
+ }
+ filterString += name;
+ filterString += ":";
+ filterString += value;
+ filterString += ":";
+
}
- filterString += name;
- filterString += ":";
- filterString += value;
- filterString += ":";
-
}
//min/max level are not part of normal regex string, but still part of filter
Modified: showeq/branches/cn187_devel/src/filtermgr.h
===================================================================
--- showeq/branches/cn187_devel/src/filtermgr.h 2024-07-04 22:21:12 UTC (rev 1480)
+++ showeq/branches/cn187_devel/src/filtermgr.h 2024-07-05 21:11:38 UTC (rev 1481)
@@ -83,25 +83,39 @@
#define FILTER_FLAG_TRACER (1 << TRACER_FILTER)
-#define FILTERSTRINGFIELD_TABLE \
- X(FSF_Name, "Name") \
- X(FSF_Level, "Level") \
- X(FSF_Race, "Race") \
- X(FSF_Class, "Class") \
- X(FSF_NPC, "NPC") \
- X(FSF_X, "X") \
- X(FSF_Y, "Y") \
- X(FSF_Z, "Z") \
- X(FSF_Light, "Light") \
- X(FSF_Deity, "Deity") \
- X(FSF_RTeam, "RTeam") \
- X(FSF_DTeam, "DTeam") \
- X(FSF_Type, "Type") \
- X(FSF_LastName, "LastName") \
- X(FSF_Guild, "Guild") \
- X(FSF_Spawn, "Spawn") \
+#define FILTERSTRINGFIELD_TABLE \
+ X(FSF_Name, "Name") \
+ X(FSF_Level, "Level") \
+ X(FSF_Race, "Race") \
+ X(FSF_Class, "Class") \
+ X(FSF_NPC, "NPC") \
+ X(FSF_X, "X") \
+ X(FSF_Y, "Y") \
+ X(FSF_Z, "Z") \
+ X(FSF_Light, "Light") \
+ X(FSF_Deity, "Deity") \
+ X(FSF_RTeam, "RTeam") \
+ X(FSF_DTeam, "DTeam") \
+ X(FSF_Type, "Type") \
+ X(FSF_LastName, "LastName") \
+ X(FSF_Guild, "Guild") \
+ X(FSF_Spawn, "Spawn") \
+ X(FSF_Info, "Info") \
X(FSF_GM, "GM")
+#define INFOFILTERSTRINGFIELD_TABLE \
+ X(IFSF_Light, "Light") \
+ X(IFSF_Head, "H") \
+ X(IFSF_Chest, "C") \
+ X(IFSF_Arms, "A") \
+ X(IFSF_Waist, "W") \
+ X(IFSF_Gloves, "G") \
+ X(IFSF_Legs, "L") \
+ X(IFSF_Feet, "F") \
+ X(IFSF_Primary, "1") \
+ X(IFSF_Secondary, "2")
+
+
#define X(a, b) a,
enum FilterStringField
{
@@ -110,7 +124,15 @@
};
#undef X
+#define X(a, b) a,
+enum InfoFilterStringField
+{
+ INFOFILTERSTRINGFIELD_TABLE
+ IFSF_Max
+};
+#undef X
+
// special handling for min/max level, which aren't part of regex filter string
#define FSF_MINLEVEL_NAME "MinLevel"
#define FSF_MINLEVEL_LABEL "Min Level"
Modified: showeq/branches/cn187_devel/src/spawn.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawn.cpp 2024-07-04 22:21:12 UTC (rev 1480)
+++ showeq/branches/cn187_devel/src/spawn.cpp 2024-07-05 21:11:38 UTC (rev 1481)
@@ -307,13 +307,13 @@
{
QString buff;
#if (QT_VERSION >= QT_VERSION_CHECK(5,5,0))
- buff = QString::asprintf("Name:%s:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d",
+ buff = QString::asprintf("Name:%s:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d:",
transformedName().toUtf8().data(),
raceString().toUtf8().data(),
classString().toUtf8().data(),
NPC(), x(), y(), z());
#else
- buff.sprintf("Name:%s:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d",
+ buff.sprintf("Name:%s:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d:",
transformedName().toUtf8().data(),
raceString().toUtf8().data(),
classString().toUtf8().data(),
@@ -971,7 +971,8 @@
QString buff;
#if (QT_VERSION >= QT_VERSION_CHECK(5,5,0))
buff = QString::asprintf("Name:%s:Level:%d:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d:"
- "Light:%s:Deity:%s:RTeam:%d:DTeam:%d:Type:%s:LastName:%s:Guild:%s:Spawn:%s:",
+ "Light:%s:Deity:%s:RTeam:%d:DTeam:%d:Type:%s:LastName:%s:Guild:%s:Spawn:%s:"
+ "Info:%s:",
name.toUtf8().data(),
level(),
raceString().toUtf8().data(),
@@ -985,11 +986,13 @@
typeString().toUtf8().data(),
lastName().toUtf8().data(),
guildTag().toUtf8().data(),
- spawnTimeStr ().replace (":", ".").toUtf8 ().data ()
+ spawnTimeStr ().replace (":", ".").toUtf8 ().data (),
+ info().toUtf8().data()
);
#else
buff.sprintf("Name:%s:Level:%d:Race:%s:Class:%s:NPC:%d:X:%d:Y:%d:Z:%d:"
- "Light:%s:Deity:%s:RTeam:%d:DTeam:%d:Type:%s:LastName:%s:Guild:%s:Spawn:%s:",
+ "Light:%s:Deity:%s:RTeam:%d:DTeam:%d:Type:%s:LastName:%s:Guild:%s:Spawn:%s:"
+ "Info:%s:",
name.toUtf8().data(),
level(),
raceString().toUtf8().data(),
@@ -1003,7 +1006,8 @@
typeString().toUtf8().data(),
lastName().toUtf8().data(),
guildTag().toUtf8().data(),
- spawnTimeStr ().replace (":", ".").toUtf8 ().data ()
+ spawnTimeStr ().replace (":", ".").toUtf8 ().data (),
+ info().toUtf8().data()
);
#endif
@@ -1032,6 +1036,7 @@
+ ":DTeam:" + QString::number(deityTeam())
+ ":Type:" + typeString()
+ ":Guild:" + guildTag()
+ + ":Info:" + info()
+ ":FilterFlags:" + QString::number(filterFlags())
+ ":";
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-07-04 22:21:14
|
Revision: 1480
http://sourceforge.net/p/seq/svn/1480
Author: cn187
Date: 2024-07-04 22:21:12 +0000 (Thu, 04 Jul 2024)
Log Message:
-----------
[qt6] Multi-display fixes
Modified Paths:
--------------
showeq/branches/cn187_devel/src/map.cpp
Modified: showeq/branches/cn187_devel/src/map.cpp
===================================================================
--- showeq/branches/cn187_devel/src/map.cpp 2024-06-29 19:03:37 UTC (rev 1479)
+++ showeq/branches/cn187_devel/src/map.cpp 2024-07-04 22:21:12 UTC (rev 1480)
@@ -238,7 +238,7 @@
// get info about the widget and its environment
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
- QRect availGeom = window()->windowHandle()->screen()->availableGeometry();
+ QRect availGeom = ((QLabel*)parent())->window()->windowHandle()->screen()->availableGeometry();
int sw = availGeom.width();
int sh = availGeom.height();
int sx = availGeom.x();
@@ -262,9 +262,9 @@
if ( y+h > sh )
y = sh - h;
if ( x < sx )
- x = sx;
+ x = sx + x;
if ( y < sy )
- y = sy;
+ y = sy + y;
move( x, y );
// show the widget
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-29 19:03:39
|
Revision: 1479
http://sourceforge.net/p/seq/svn/1479
Author: cn187
Date: 2024-06-29 19:03:37 +0000 (Sat, 29 Jun 2024)
Log Message:
-----------
Create the thread before we try to set its priority
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packetcapture.cpp
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-28 00:12:09 UTC (rev 1478)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-29 19:03:37 UTC (rev 1479)
@@ -82,7 +82,6 @@
{
char ebuf[PCAP_ERRBUF_SIZE]; // pcap error buffer
char filter_buf[256]; // pcap filter buffer
- struct sched_param sp;
seqInfo("Initializing Packet Capture Thread: ");
m_pcache_closed = false;
@@ -135,23 +134,12 @@
exit(0);
}
- this->setFilter(device, host, realtime, address_type, 0, 0);
-
m_pcache_first = m_pcache_last = NULL;
pthread_create (&m_tid, NULL, loop, (void*)this);
- if (realtime)
- {
- memset (&sp, 0, sizeof (sp));
- sp.sched_priority = 1;
- if (pthread_setschedparam (m_tid, SCHED_RR, &sp) != 0)
- {
- seqWarn("Failed to set capture thread realtime.");
- }
- }
+ this->setFilter(device, host, realtime, address_type, 0, 0);
- m_pcapFilter = filter_buf;
}
//------------------------------------------------------------------------
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-28 00:12:12
|
Revision: 1478
http://sourceforge.net/p/seq/svn/1478
Author: cn187
Date: 2024-06-28 00:12:09 +0000 (Fri, 28 Jun 2024)
Log Message:
-----------
Additional fixes for entities fix
Modified Paths:
--------------
showeq/branches/cn187_devel/src/spawnshell.cpp
Modified: showeq/branches/cn187_devel/src/spawnshell.cpp
===================================================================
--- showeq/branches/cn187_devel/src/spawnshell.cpp 2024-06-28 00:12:00 UTC (rev 1477)
+++ showeq/branches/cn187_devel/src/spawnshell.cpp 2024-06-28 00:12:09 UTC (rev 1478)
@@ -1698,8 +1698,17 @@
// remove the player from the list (if it had a 0 id)
m_players.take(0);
+ Item* old = m_players.take(oldPlayerID);
+ if (old != m_player)
+ delete old;
+
+ //if the new ID already exists (sometimes as an unknown spawn) remove it
+ Item* existing = m_players.take(newPlayerID);
+ if (existing != m_player)
+ delete existing;
+
// re-insert the player into the list
- m_players.insert(newPlayerID, m_players.take(oldPlayerID));
+ m_players.insert(newPlayerID, m_player);
emit changeItem(m_player, tSpawnChangedALL);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-28 00:12:03
|
Revision: 1477
http://sourceforge.net/p/seq/svn/1477
Author: cn187
Date: 2024-06-28 00:12:00 +0000 (Fri, 28 Jun 2024)
Log Message:
-----------
Rework capture filter and session detection logic
- reduce code duplication
- fix issues with session detection when an IP address isn't specified
- fix issues with session detection when specifying a MAC
- fix other related bugs
Modified Paths:
--------------
showeq/branches/cn187_devel/src/interface.cpp
showeq/branches/cn187_devel/src/packet.cpp
showeq/branches/cn187_devel/src/packet.h
showeq/branches/cn187_devel/src/packetcapture.cpp
showeq/branches/cn187_devel/src/packetstream.cpp
showeq/branches/cn187_devel/src/packetstream.h
Modified: showeq/branches/cn187_devel/src/interface.cpp
===================================================================
--- showeq/branches/cn187_devel/src/interface.cpp 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/interface.cpp 2024-06-28 00:12:00 UTC (rev 1477)
@@ -5239,7 +5239,7 @@
maclst, 0, true, &ok);
if (ok)
{
- if (address.length() != 17)
+ if (address.length() != 17 && !address.isEmpty())
{
seqWarn("Invalid MAC Address (%s)! Ignoring!", address.toLatin1().data());
return;
Modified: showeq/branches/cn187_devel/src/packet.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packet.cpp 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/packet.cpp 2024-06-28 00:12:00 UTC (rev 1477)
@@ -181,54 +181,38 @@
// no client/server ports yet
m_clientPort = 0;
m_serverPort = 0;
-
- struct hostent *he;
- struct in_addr ia;
+
if (m_ip.isEmpty() && m_mac.isEmpty())
- seqFatal("No address specified");
-
- if (!m_ip.isEmpty())
{
- /* Substitute "special" IP which is interpreted
- to set up a different filter for picking up new sessions */
-
- if (m_ip == "auto")
- inet_aton (AUTOMATIC_CLIENT_IP, &ia);
- else if (inet_aton (m_ip.toLatin1().data(), &ia) == 0)
- {
- he = gethostbyname(m_ip.toLatin1().data());
- if (!he)
- seqFatal("Invalid address; %s", m_ip.toLatin1().data());
-
- memcpy (&ia, he->h_addr_list[0], he->h_length);
- }
- m_client_addr = ia.s_addr;
- m_ip = inet_ntoa(ia);
-
- if (m_ip == AUTOMATIC_CLIENT_IP)
- {
- m_detectingClient = true;
- seqInfo("Listening for first client seen.");
- }
- else
- {
- m_detectingClient = false;
- seqInfo("Listening for client: %s", m_ip.toLatin1().data());
- }
+ seqInfo("No address specified. Defaulting to client auto-detect");
+ m_ip = AUTOMATIC_CLIENT_IP;
}
+ validateIP();
+
if (m_playbackPackets == PLAYBACK_OFF)
{
// create the pcap object and initialize, either with MAC or IP
m_packetCapture = new PacketCaptureThread();
if (m_mac.length() == 17)
+ {
+ seqInfo("Listening for client MAC: %s", m_mac.toLatin1().data());
+
m_packetCapture->start(m_device.toLatin1().data(),
m_mac.toLatin1().data(),
m_realtime, MAC_ADDRESS_TYPE );
+ }
else
+ {
+ if (m_detectingClient)
+ seqInfo("Listening for next client seen. (you must zone for this to work!)");
+ else
+ seqInfo("Listening for client: %s", m_ip.toLatin1().data());
+
m_packetCapture->start(m_device.toLatin1().data(),
m_ip.toLatin1().data(),
m_realtime, IP_ADDRESS_TYPE );
+ }
emit filterChanged();
}
else if (m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
@@ -303,6 +287,43 @@
}
}
+//helper function to verify specified IP is a valid IP or hostname, and/or
+//to set up auto detection.
+void EQPacket::validateIP()
+{
+ struct in_addr ia;
+ struct hostent *he;
+
+ if (m_ip.isEmpty() || m_ip == AUTOMATIC_CLIENT_IP)
+ {
+ /* Substitute "special" IP which is interpreted
+ to set up a different filter for picking up new sessions */
+ inet_aton (AUTOMATIC_CLIENT_IP, &ia);
+ }
+ else if (inet_aton (m_ip.toLatin1().data(), &ia) == 0)
+ {
+ he = gethostbyname(m_ip.toLatin1().data());
+ if (he)
+ {
+ memcpy (&ia, he->h_addr_list[0], he->h_length);
+ }
+ else
+ {
+ // If the IP or host is invalid, default to auto-detect, rather
+ // than immediately exiting (the previous behavior)
+ seqWarn("Invalid address or hostname: %s", m_ip.toLatin1().data());
+ seqWarn("Defaulting to client auto-detect");
+ m_ip = AUTOMATIC_CLIENT_IP;
+ inet_aton (AUTOMATIC_CLIENT_IP, &ia);
+ }
+ }
+ m_client_addr = ia.s_addr;
+ m_ip = inet_ntoa(ia);
+
+ m_detectingClient = (m_ip == AUTOMATIC_CLIENT_IP);
+
+}
+
////////////////////////////////////////////////////
// Destructor
EQPacket::~EQPacket()
@@ -557,9 +578,9 @@
this,
SIGNAL(sessionTrackingChanged(uint8_t)));
connect(stream,
- SIGNAL(lockOnClient(in_port_t, in_port_t)),
+ SIGNAL(lockOnClient(in_port_t, in_port_t, in_addr_t)),
this,
- SLOT(lockOnClient(in_port_t, in_port_t)));
+ SLOT(lockOnClient(in_port_t, in_port_t, in_addr_t)));
connect(stream,
SIGNAL(closing(uint32_t, EQStreamID)),
this,
@@ -697,23 +718,32 @@
// If we just closed the zone server session, unlatch the client port
if (streamId == zone2client || streamId == client2zone)
{
- m_clientPort = 0;
- m_serverPort = 0;
+ unlatchClientPort();
- emit clientPortLatched(m_clientPort);
-
seqInfo("EQPacket: SessionDisconnect detected, awaiting next zone session, pcap filter: EQ Client %s",
- m_ip.toLatin1().data());
+ (m_ip == AUTOMATIC_CLIENT_IP) ? "auto-detect" : m_ip.toLatin1().data());
}
}
+// Unlatch a locked-on client port, so the next client is detected correctly
+void EQPacket::unlatchClientPort()
+{
+ m_clientPort = 0;
+ m_serverPort = 0;
+ emit clientPortLatched(m_clientPort);
+}
+
+
////////////////////////////////////////////////////
// Locks onto a specific client port (for session tracking)
-void EQPacket::lockOnClient(in_port_t serverPort, in_port_t clientPort)
+void EQPacket::lockOnClient(in_port_t serverPort, in_port_t clientPort, in_addr_t clientAddr)
{
m_serverPort = serverPort;
m_clientPort = clientPort;
+ m_client_addr = clientAddr;
+ in_addr ia = inet_makeaddr(m_client_addr, m_client_addr);
+
if (m_playbackPackets == PLAYBACK_OFF ||
m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
{
@@ -746,7 +776,7 @@
else
{
seqInfo("EQPacket: SessionRequest detected, pcap filter: EQ Client %s, Client port %d. Server port %d",
- m_ip.toLatin1().data(), m_clientPort, m_serverPort);
+ inet_ntoa(ia), m_clientPort, m_serverPort);
}
emit clientPortLatched(m_clientPort);
@@ -921,14 +951,14 @@
void EQPacket::monitorIPClient(const QString& ip)
{
m_ip = ip;
- struct in_addr ia;
- inet_aton (m_ip.toLatin1().data(), &ia);
- m_client_addr = ia.s_addr;
+
+ validateIP();
+
emit clientChanged(m_client_addr);
resetEQPacket();
- seqInfo("Listening for IP client: %s", m_ip.toLatin1().data());
+ seqInfo("Listening for IP client: %s", (m_ip == AUTOMATIC_CLIENT_IP) ? "auto-detect" : m_ip.toLatin1().data());
if (m_playbackPackets == PLAYBACK_OFF ||
m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
{
@@ -945,24 +975,32 @@
void EQPacket::monitorMACClient(const QString& mac)
{
m_mac = mac;
- m_detectingClient = true;
struct in_addr ia;
inet_aton (AUTOMATIC_CLIENT_IP, &ia);
+ m_detectingClient = true;
m_client_addr = ia.s_addr;
emit clientChanged(m_client_addr);
resetEQPacket();
- seqInfo("Listening for MAC client: %s", m_mac.toLatin1().data());
+ if (!m_mac.isEmpty() && m_mac.length() == 17)
+ {
+ seqInfo("Listening for MAC client: %s", m_mac.toLatin1().data());
- if (m_playbackPackets == PLAYBACK_OFF ||
- m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
+ if (m_playbackPackets == PLAYBACK_OFF ||
+ m_playbackPackets == PLAYBACK_FORMAT_TCPDUMP)
+ {
+ m_packetCapture->setFilter(m_device.toLatin1().data(),
+ m_mac.toLatin1().data(),
+ m_realtime,
+ MAC_ADDRESS_TYPE, 0, 0);
+ emit filterChanged();
+ }
+ }
+ else
{
- m_packetCapture->setFilter(m_device.toLatin1().data(),
- m_ip.toLatin1().data(),
- m_realtime,
- IP_ADDRESS_TYPE, 0, 0);
- emit filterChanged();
+ seqWarn("Invalid MAC specified. Defaulting to auto-detect of next client.");
+ monitorNextClient();
}
}
@@ -1005,50 +1043,31 @@
// stop the current packet capture
m_packetCapture->stop();
- // setup for capture on new device
- if (!m_ip.isEmpty())
- {
- struct hostent *he;
- struct in_addr ia;
+ validateIP();
- /* Substitute "special" IP which is interpreted
- to set up a different filter for picking up new sessions */
-
- if (m_ip == "auto")
- inet_aton (AUTOMATIC_CLIENT_IP, &ia);
- else if (inet_aton (m_ip.toLatin1().data(), &ia) == 0)
- {
- he = gethostbyname(m_ip.toLatin1().data());
- if (!he)
- seqFatal("Invalid address; %s", m_ip.toLatin1().data());
-
- memcpy (&ia, he->h_addr_list[0], he->h_length);
- }
- m_client_addr = ia.s_addr;
- m_ip = inet_ntoa(ia);
-
- if (m_ip == AUTOMATIC_CLIENT_IP)
- {
- m_detectingClient = true;
- seqInfo("Listening for first client seen.");
- }
- else
- {
- m_detectingClient = false;
- seqInfo("Listening for client: %s", m_ip.toLatin1().data());
- }
- }
-
resetEQPacket();
// restart packet capture
if (m_mac.length() == 17)
+ {
+ seqInfo("Listening for client MAC: %s", m_mac.toLatin1().data());
+
m_packetCapture->start(m_device.toLatin1().data(),
m_mac.toLatin1().data(),
m_realtime, MAC_ADDRESS_TYPE );
+ }
else
- m_packetCapture->start(m_device.toLatin1().data(), m_ip.toLatin1().data(),
- m_realtime, IP_ADDRESS_TYPE );
+ {
+ if (m_detectingClient)
+ seqInfo("Listening for next client seen. (you must zone for this to work!)");
+ else
+ seqInfo("Listening for client: %s", m_ip.toLatin1().data());
+
+ m_packetCapture->start(m_device.toLatin1().data(),
+ m_ip.toLatin1().data(),
+ m_realtime, IP_ADDRESS_TYPE );
+ }
+
emit filterChanged();
}
@@ -1127,10 +1146,7 @@
m_zone2ClientStream->reset();
m_zone2ClientStream->setSessionTracking(m_session_tracking);
- m_clientPort = 0;
- m_serverPort = 0;
-
- emit clientPortLatched(m_clientPort);
+ unlatchClientPort();
}
///////////////////////////////////////////
Modified: showeq/branches/cn187_devel/src/packet.h
===================================================================
--- showeq/branches/cn187_devel/src/packet.h 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/packet.h 2024-06-28 00:12:00 UTC (rev 1477)
@@ -121,7 +121,8 @@
protected slots:
void closeStream(uint32_t sessionId, EQStreamID streamId);
- void lockOnClient(in_port_t serverPort, in_port_t clientPort);
+ void unlatchClientPort();
+ void lockOnClient(in_port_t serverPort, in_port_t clientPort, in_addr_t clientAddr);
signals:
// used for net_stats display
@@ -158,6 +159,7 @@
bool unknown);
private:
+ void validateIP();
PacketCaptureProviderThread* m_packetCapture;
VPacket* m_vPacket;
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-28 00:12:00 UTC (rev 1477)
@@ -376,13 +376,13 @@
if (address_type == IP_ADDRESS_TYPE)
{
- if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
+ if (hostname && strlen(hostname) && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
// host was specified/detected
pfb += sprintf(pfb, " and host %s", hostname);
}
else if (address_type == MAC_ADDRESS_TYPE)
{
- if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
+ if (hostname && strlen(hostname) && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
// mac was specified
pfb += sprintf(pfb, " and ether host %s", hostname);
}
Modified: showeq/branches/cn187_devel/src/packetstream.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetstream.cpp 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/packetstream.cpp 2024-06-28 00:12:00 UTC (rev 1477)
@@ -92,6 +92,7 @@
m_sessionId(0),
m_sessionKey(0),
m_sessionClientPort(0),
+ m_sessionClientIP(0),
m_maxLength(0),
m_decodeKey(0),
m_validKey(true)
@@ -196,6 +197,7 @@
m_arqSeqExp = 0;
m_arqSeqFound = false;
m_sessionClientPort = 0;
+ m_sessionClientIP = 0;
m_sessionId = 0;
m_sessionKey = 0;
}
@@ -543,9 +545,11 @@
// Only accept packets that correspond to our latched client port, if
// it is set. This helps filter out multiple sessions on the same physical
// host when two eq clients zone at the same time. The first one will win.
- if (m_sessionClientPort != 0 &&
+ if (m_sessionClientPort != 0 && m_sessionClientIP != 0 &&
((dir() == DIR_Server && m_sessionClientPort != packet.getDestPort()) ||
- (dir() == DIR_Client && m_sessionClientPort != packet.getSourcePort())))
+ (dir() == DIR_Client && m_sessionClientPort != packet.getSourcePort()) ||
+ (dir() == DIR_Server && m_sessionClientIP != packet.getIPv4DestN()) ||
+ (dir() == DIR_Client && m_sessionClientIP != packet.getIPv4SourceN())))
{
#if (defined(PACKET_PROCESS_DIAG) && (PACKET_PROCESS_DIAG > 1)) || (defined(PACKET_SESSION_DIAG) && PACKET_SESSION_DIAG > 1)
seqDebug("discarding packet %s:%d ==>%s:%d netopcode=%04x size=%d. Multiple sessions on the same box? Ignoring all but one of them. Latched client port %d. Session tracking %s.",
@@ -1038,6 +1042,7 @@
// later. SessionRequest should always be an outer protocol packet
// so we can cast it to EQUDPIPPacketFormat to get the ip headers.
m_sessionClientPort = ((EQUDPIPPacketFormat&) packet).getSourcePort();
+ m_sessionClientIP = ((EQUDPIPPacketFormat&) packet).getIPv4SourceN();
}
}
break;
@@ -1132,6 +1137,7 @@
// later. SessionRequest should always be an outer protocol packet
// so we can cast it to EQUDPIPPacketFormat to get the ip headers.
m_sessionClientPort = ((EQUDPIPPacketFormat&) packet).getDestPort();
+ m_sessionClientIP = ((EQUDPIPPacketFormat&) packet).getIPv4DestN();
// If this is the world server talking to us, reset session tracking if
// it is on so we unlatch the client in case of getting kicked.
@@ -1149,8 +1155,9 @@
// headers!
m_session_tracking_enabled = 2;
- emit lockOnClient(((EQUDPIPPacketFormat&) packet).getSourcePort(),
- ((EQUDPIPPacketFormat&) packet).getDestPort());
+ emit lockOnClient(((EQUDPIPPacketFormat&) packet).getSourcePort(),
+ ((EQUDPIPPacketFormat&) packet).getDestPort(),
+ ((EQUDPIPPacketFormat&) packet).getIPv4DestN());
emit sessionTrackingChanged(m_session_tracking_enabled);
}
}
@@ -1200,6 +1207,7 @@
emit sessionTrackingChanged(m_session_tracking_enabled);
m_sessionClientPort = 0;
+ m_sessionClientIP = 0;
}
emit closing(m_sessionId, m_streamid);
Modified: showeq/branches/cn187_devel/src/packetstream.h
===================================================================
--- showeq/branches/cn187_devel/src/packetstream.h 2024-06-25 00:14:58 UTC (rev 1476)
+++ showeq/branches/cn187_devel/src/packetstream.h 2024-06-28 00:12:00 UTC (rev 1477)
@@ -112,7 +112,7 @@
// this signals a change in the session tracking state
void sessionTrackingChanged(uint8_t);
- void lockOnClient(in_port_t serverPort, in_port_t clientPort);
+ void lockOnClient(in_port_t serverPort, in_port_t clientPort, in_addr_t clientAddr);
// Signal a new session key being received
void sessionKey(uint32_t sessionId, EQStreamID streadid, uint32_t sessionKey);
@@ -155,6 +155,7 @@
uint32_t m_sessionId;
uint32_t m_sessionKey;
in_port_t m_sessionClientPort;
+ in_addr_t m_sessionClientIP;
uint32_t m_maxLength;
// encryption
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-25 00:15:00
|
Revision: 1476
http://sourceforge.net/p/seq/svn/1476
Author: cn187
Date: 2024-06-25 00:14:58 +0000 (Tue, 25 Jun 2024)
Log Message:
-----------
More capture logic fixes
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packetcapture.cpp
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-24 19:19:34 UTC (rev 1475)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-25 00:14:58 UTC (rev 1476)
@@ -386,6 +386,10 @@
// mac was specified
pfb += sprintf(pfb, " and ether host %s", hostname);
}
+ else if (address_type == DEFAULT_ADDRESS_TYPE)
+ {
+ //don't specify IP or MAC address in filter string
+ }
else
{
seqFatal("pcap_error:filter_string: unknown address_type (%d)", address_type);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-24 19:19:36
|
Revision: 1475
http://sourceforge.net/p/seq/svn/1475
Author: cn187
Date: 2024-06-24 19:19:34 +0000 (Mon, 24 Jun 2024)
Log Message:
-----------
Fixes for capture filter logic
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packetcapture.cpp
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-19 19:27:23 UTC (rev 1474)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-24 19:19:34 UTC (rev 1475)
@@ -82,16 +82,11 @@
{
char ebuf[PCAP_ERRBUF_SIZE]; // pcap error buffer
char filter_buf[256]; // pcap filter buffer
- struct bpf_program bpp;
struct sched_param sp;
- bpf_u_int32 mask; // sniff device netmask
- bpf_u_int32 net; // sniff device ip
seqInfo("Initializing Packet Capture Thread: ");
m_pcache_closed = false;
- this->setFilter(device, host, realtime, address_type, 0, 0);
-
/* A word about pcap_open_live() from the docs
** to_ms specifies the read timeout in milliseconds. The
** read timeout is used to arrange that the read not necessarily
@@ -140,20 +135,8 @@
exit(0);
}
- if (pcap_compile(m_pcache_pcap, &bpp, filter_buf, 1, net) == -1)
- {
- pcap_perror (m_pcache_pcap, (char*)"pcap_error:pcap_compile");
- exit(0);
- }
+ this->setFilter(device, host, realtime, address_type, 0, 0);
- if (pcap_setfilter (m_pcache_pcap, &bpp) == -1)
- {
- pcap_perror (m_pcache_pcap, (char*)"pcap_error:pcap_setfilter");
- exit(0);
- }
-
- pcap_freecode(&bpp);
-
m_pcache_first = m_pcache_last = NULL;
pthread_create (&m_tid, NULL, loop, (void*)this);
@@ -366,8 +349,8 @@
char ebuf[PCAP_ERRBUF_SIZE];
struct bpf_program bpp;
struct sched_param sp;
- bpf_u_int32 mask; // sniff device netmask
- bpf_u_int32 net; // sniff device ip
+ bpf_u_int32 mask = 0; // sniff device netmask
+ bpf_u_int32 net = 0 ; // sniff device ip
// Fetch the netmask for the device to use later with the filter
if (pcap_lookupnet(device, &net, &mask, ebuf) == -1)
@@ -395,13 +378,13 @@
{
if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
// host was specified/detected
- pfb += sprintf(" and host %s", hostname);
+ pfb += sprintf(pfb, " and host %s", hostname);
}
else if (address_type == MAC_ADDRESS_TYPE)
{
if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
// mac was specified
- pfb += sprintf(" and ether host %s", hostname);
+ pfb += sprintf(pfb, " and ether host %s", hostname);
}
else
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-19 19:27:26
|
Revision: 1474
http://sourceforge.net/p/seq/svn/1474
Author: cn187
Date: 2024-06-19 19:27:23 +0000 (Wed, 19 Jun 2024)
Log Message:
-----------
Release 6.3.15
- Update version to 6.3.15
- Support for EQ Patch 06/19/24
- Struct and opcode updates
Modified Paths:
--------------
showeq/branches/cn187_devel/ChangeLog
showeq/branches/cn187_devel/conf/zoneopcodes.xml
showeq/branches/cn187_devel/configure.in
showeq/branches/cn187_devel/src/everquest.h
Modified: showeq/branches/cn187_devel/ChangeLog
===================================================================
--- showeq/branches/cn187_devel/ChangeLog 2024-06-19 19:27:15 UTC (rev 1473)
+++ showeq/branches/cn187_devel/ChangeLog 2024-06-19 19:27:23 UTC (rev 1474)
@@ -1,3 +1,9 @@
+cn187 (06/19/24)
+----------------
+- Update to version 6.3.15
+- Support for EQ Patch 06/19/24
+- Struct and opcode updates
+
cn187 (05/15/24)
----------------
- Update to version 6.3.14
Modified: showeq/branches/cn187_devel/conf/zoneopcodes.xml
===================================================================
--- showeq/branches/cn187_devel/conf/zoneopcodes.xml 2024-06-19 19:27:15 UTC (rev 1473)
+++ showeq/branches/cn187_devel/conf/zoneopcodes.xml 2024-06-19 19:27:23 UTC (rev 1474)
@@ -3,70 +3,70 @@
<seqopcodes>
<!-- Critical opcodes used directly by ShowEQ -->
- <opcode id="7b63" name="OP_PlayerProfile" updated="05/15/24">
+ <opcode id="3132" name="OP_PlayerProfile" updated="06/19/24">
<comment>CharProfileCode</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="3af9" name="OP_ZoneEntry" updated="05/15/24">
+ <opcode id="5e3e" name="OP_ZoneEntry" updated="06/19/24">
<comment>ZoneEntryCode</comment>
<payload dir="client" typename="ClientZoneEntryStruct" sizechecktype="match"/>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="188f" name="OP_TimeOfDay" updated="05/15/24">
+ <opcode id="3407" name="OP_TimeOfDay" updated="06/19/24">
<comment>TimeOfDayCode</comment>
<payload dir="server" typename="timeOfDayStruct" sizechecktype="match"/>
</opcode>
- <opcode id="4239" name="OP_NewZone" updated="05/15/24">
+ <opcode id="5e02" name="OP_NewZone" updated="06/19/24">
<comment>NewZoneCode</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="30e8" name="OP_SpawnDoor" updated="05/15/24">
+ <opcode id="12c4" name="OP_SpawnDoor" updated="06/19/24">
<comment>DoorSpawnsCode</comment>
<payload dir="server" typename="doorStruct" sizechecktype="modulus"/>
</opcode>
- <opcode id="5cce" name="OP_GroundSpawn" updated="05/15/24">
+ <opcode id="739b" name="OP_GroundSpawn" updated="06/19/24">
<comment>MakeDropCode</comment>
<payload dir="server" typename="makeDropStruct" sizechecktype="none"/>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="05a5" name="OP_SendZonePoints" updated="05/15/24">
+ <opcode id="6086" name="OP_SendZonePoints" updated="06/19/24">
<comment>Coords in a zone that will port you to another zone</comment>
<payload dir="server" typename="zonePointsStruct" sizechecktype="none"/>
</opcode>
- <opcode id="1786" name="OP_AAExpUpdate" updated="05/15/24">
+ <opcode id="0753" name="OP_AAExpUpdate" updated="06/19/24">
<comment>Receiving AA experience. Also when percent to AA changes.</comment>
<payload dir="server" typename="altExpUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="7fd6" name="OP_ExpUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_ExpUpdate" updated="07/19/23">
<comment>ExpUpdateCode</comment>
<payload dir="server" typename="expUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="06e6" name="OP_GuildMOTD" updated="05/15/24">
+ <opcode id="6b08" name="OP_GuildMOTD" updated="06/19/24">
<comment>GuildMOTD</comment>
<payload dir="server" typename="guildMOTDStruct" sizechecktype="none"/>
</opcode>
- <opcode id="7da8" name="OP_ClientUpdate" updated="05/15/24">
+ <opcode id="0c4e" name="OP_ClientUpdate" updated="06/19/24">
<comment>Position updates</comment>
<payload dir="server" typename="playerSpawnPosStruct" sizechecktype="match"/>
<payload dir="both" typename="playerSelfPosStruct" sizechecktype="match"/>
</opcode>
- <opcode id="798b" name="OP_NpcMoveUpdate" updated="05/15/24">
+ <opcode id="6ed3" name="OP_NpcMoveUpdate" updated="06/19/24">
<comment>Position updates</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="6c1e" name="OP_MobUpdate" updated="05/15/24">
+ <opcode id="669f" name="OP_MobUpdate" updated="06/19/24">
<comment>MobUpdateCode</comment>
<payload dir="both" typename="spawnPositionUpdate" sizechecktype="match"/>
</opcode>
- <opcode id="4e6a" name="OP_DeleteSpawn" updated="05/15/24">
+ <opcode id="0bee" name="OP_DeleteSpawn" updated="06/19/24">
<comment>DeleteSpawnCode</comment>
<payload dir="both" typename="deleteSpawnStruct" sizechecktype="match"/>
</opcode>
- <opcode id="1e0c" name="OP_RemoveSpawn" updated="05/15/24">
+ <opcode id="1a60" name="OP_RemoveSpawn" updated="06/19/24">
<comment>Remove spawn from zone</comment>
<payload dir="both" typename="removeSpawnStruct" sizechecktype="none"/>
</opcode>
- <opcode id="00ec" name="OP_Death" updated="05/15/24">
+ <opcode id="3f63" name="OP_Death" updated="06/19/24">
<comment>old NewCorpseCode</comment>
<payload dir="server" typename="newCorpseStruct" sizechecktype="match"/>
</opcode>
@@ -74,56 +74,56 @@
<comment>SpawnUpdateCode</comment>
<payload dir="both" typename="SpawnUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3178" name="OP_SpawnAppearance" updated="05/15/24">
+ <opcode id="59cf" name="OP_SpawnAppearance" updated="06/19/24">
<comment>SpawnAppearanceCode</comment>
<payload dir="both" typename="spawnAppearanceStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0b0d" name="OP_Stamina" updated="07/19/23">
+ <opcode id="ffff" name="OP_Stamina" updated="07/19/23">
<comment>Server updating on hunger/thirst</comment>
<payload dir="server" typename="staminaStruct" sizechecktype="match"/>
</opcode>
- <opcode id="639d" name="OP_HPUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_HPUpdate" updated="07/19/23">
<comment>NpcHpUpdateCode Update HP % of a PC or NPC</comment>
<payload dir="both" typename="hpNpcUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="2e5b" name="OP_GuildMemberUpdate" updated="05/15/24">
+ <opcode id="082d" name="OP_GuildMemberUpdate" updated="06/19/24">
<comment>Info regarding guild members</comment>
<payload dir="server" typename="GuildMemberUpdate" sizechecktype="match"/>
</opcode>
- <opcode id="0c2e" name="OP_ClickObject" updated="05/15/24">
+ <opcode id="2870" name="OP_ClickObject" updated="06/19/24">
<comment>Items dropped on the ground</comment>
<payload dir="both" typename="remDropStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3a56" name="OP_Action" updated="05/15/24">
+ <opcode id="24fc" name="OP_Action" updated="06/19/24">
<comment>Spells cast etc</comment>
<payload dir="both" typename="actionStruct" sizechecktype="match"/>
<payload dir="both" typename="actionAltStruct" sizechecktype="match"/>
</opcode>
- <opcode id="56d8" name="OP_Action2" updated="04/17/24">
+ <opcode id="ffff" name="OP_Action2" updated="04/17/24">
<comment>Combat actions i.e. bash, kick etc</comment>
<payload dir="both" typename="action2Struct" sizechecktype="match"/>
</opcode>
- <opcode id="7b3d" name="OP_Consider" updated="05/15/24">
+ <opcode id="0fd2" name="OP_Consider" updated="06/19/24">
<comment>ConsiderCode</comment>
<payload dir="both" typename="considerStruct" sizechecktype="match"/>
</opcode>
- <opcode id="4a96" name="OP_TargetMouse" updated="05/15/24">
+ <opcode id="133c" name="OP_TargetMouse" updated="06/19/24">
<comment>Targeting a person - old ClientTargetCode</comment>
<payload dir="both" typename="clientTargetStruct" sizechecktype="match"/>
</opcode>
- <opcode id="67ec" name="OP_SpawnRename" updated="07/19/23">
+ <opcode id="ffff" name="OP_SpawnRename" updated="07/19/23">
<comment>Spawns getting renamed after initial NewSpawn</comment>
<payload dir="server" typename="spawnRenameStruct" sizechecktype="match"/>
</opcode>
- <opcode id="5587" name="OP_Illusion" updated="07/19/23">
+ <opcode id="ffff" name="OP_Illusion" updated="07/19/23">
<comment>Spawn being illusioned (changing forms)</comment>
<payload dir="both" typename="spawnIllusionStruct" sizechecktype="match"/>
</opcode>
- <opcode id="04f8" name="OP_Shroud" updated="07/19/23">
+ <opcode id="ffff" name="OP_Shroud" updated="07/19/23">
<comment>Server putting players into shroud form</comment>
<payload dir="server" typename="spawnShroudSelf" sizechecktype="none"/>
</opcode>
- <opcode id="54e6" name="OP_ZoneChange" updated="05/15/24">
+ <opcode id="146c" name="OP_ZoneChange" updated="06/19/24">
<comment>old ZoneChangeCode</comment>
<payload dir="both" typename="zoneChangeStruct" sizechecktype="match"/>
</opcode>
@@ -163,55 +163,55 @@
<comment>Group leader change</comment>
<payload dir="server" typename="groupLeaderChangeStruct" sizechecktype="match"/>
</opcode>
- <opcode id="211c" name="OP_Buff" updated="07/19/23">
+ <opcode id="ffff" name="OP_Buff" updated="07/19/23">
<comment>old BuffDropCode</comment>
<payload dir="both" typename="buffStruct" sizechecktype="match"/>
</opcode>
- <opcode id="5466" name="OP_BeginCast" updated="07/19/23">
+ <opcode id="ffff" name="OP_BeginCast" updated="07/19/23">
<comment>BeginCastCode</comment>
<payload dir="both" typename="beginCastStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0b36" name="OP_CastSpell" updated="12/05/23">
+ <opcode id="ffff" name="OP_CastSpell" updated="12/05/23">
<comment>StartCastCode</comment>
<payload dir="both" typename="startCastStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3a19" name="OP_SwapSpell" updated="07/19/23">
+ <opcode id="ffff" name="OP_SwapSpell" updated="07/19/23">
<comment>TradeSpellBookSlotsCode</comment>
<payload dir="both" typename="tradeSpellBookSlotsStruct" sizechecktype="match"/>
</opcode>
- <opcode id="1af6" name="OP_MemorizeSpell" updated="07/19/23">
+ <opcode id="ffff" name="OP_MemorizeSpell" updated="07/19/23">
<comment>MemSpellCode</comment>
<payload dir="both" typename="memSpellStruct" sizechecktype="match"/>
</opcode>
- <opcode id="37d6" name="OP_InspectAnswer" updated="07/19/23">
+ <opcode id="ffff" name="OP_InspectAnswer" updated="07/19/23">
<comment>InspectDataCode</comment>
<payload dir="both" typename="inspectDataStruct" sizechecktype="match"/>
</opcode>
- <opcode id="49f5" name="OP_Emote" updated="07/19/23">
+ <opcode id="ffff" name="OP_Emote" updated="07/19/23">
<comment>EmoteTextCode</comment>
<payload dir="both" typename="emoteTextStruct" sizechecktype="none"/>
</opcode>
- <opcode id="5f08" name="OP_SimpleMessage" updated="05/15/24">
+ <opcode id="3256" name="OP_SimpleMessage" updated="06/19/24">
<comment>SimpleMessageCode</comment>
<payload dir="server" typename="simpleMessageStruct" sizechecktype="match"/>
</opcode>
- <opcode id="445d" name="OP_FormattedMessage" updated="05/15/24">
+ <opcode id="3fba" name="OP_FormattedMessage" updated="06/19/24">
<comment>FormattedMessageCode i.e. pet dismissed etc</comment>
<payload dir="server" typename="formattedMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="0f8c" name="OP_CommonMessage" updated="05/15/24">
+ <opcode id="2148" name="OP_CommonMessage" updated="06/19/24">
<comment>ChannelMessageCode i.e. /tell /ooc /shout etc</comment>
<payload dir="both" typename="channelMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="554c" name="OP_SpecialMesg" updated="05/15/24">
+ <opcode id="686f" name="OP_SpecialMesg" updated="06/19/24">
<comment>Communicate textual info to client including hail responses etc</comment>
<payload dir="server" typename="specialMessageStruct" sizechecktype="none"/>
</opcode>
- <opcode id="638b" name="OP_RandomReq" updated="07/19/23">
+ <opcode id="ffff" name="OP_RandomReq" updated="07/19/23">
<comment>RandomReqCode</comment>
<payload dir="client" typename="randomReqStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0312" name="OP_RandomReply" updated="07/19/23">
+ <opcode id="ffff" name="OP_RandomReply" updated="07/19/23">
<comment>RandomCode</comment>
<payload dir="server" typename="randomStruct" sizechecktype="match"/>
</opcode>
@@ -223,36 +223,36 @@
<comment>Server replying with deny information after /deny</comment>
<payload dir="server" typename="consentResponseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="3d4f" name="OP_ManaChange" updated="07/19/23">
+ <opcode id="ffff" name="OP_ManaChange" updated="07/19/23">
<comment>Mana change. Bards send this up with no size. Casters receive this for mana updates.</comment>
<payload dir="server" typename="manaDecrementStruct" sizechecktype="match"/>
<payload dir="client" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="499c" name="OP_BazaarSearchRequest" updated="07/19/23">
+ <opcode id="ffff" name="OP_BazaarSearchRequest" updated="07/19/23">
<comment>Bazaar search request </comment>
<payload dir="client" typename="bazaarSearchQueryStruct" sizechecktype="none"/>
</opcode>
- <opcode id="2d7e" name="OP_BazaarSearchResponse" updated="07/19/23">
+ <opcode id="ffff" name="OP_BazaarSearchResponse" updated="07/19/23">
<comment>Bazaar search Response - Struct incorrect </comment>
<payload dir="server" typename="bazaarSearchResponseStruct" sizechecktype="modulus"/>
</opcode>
- <opcode id="09b6" name="OP_MoneyOnCorpse" updated="07/19/23">
+ <opcode id="ffff" name="OP_MoneyOnCorpse" updated="07/19/23">
<comment>MoneyOnCorpseCode</comment>
<payload dir="server" typename="moneyOnCorpseStruct" sizechecktype="match"/>
</opcode>
- <opcode id="4aa9" name="OP_SkillUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_SkillUpdate" updated="07/19/23">
<comment>Skill up code</comment>
<payload dir="server" typename="skillIncStruct" sizechecktype="match"/>
</opcode>
- <opcode id="262e" name="OP_LevelUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_LevelUpdate" updated="07/19/23">
<comment>LevelUpUpdateCode</comment>
<payload dir="server" typename="levelUpUpdateStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0f58" name="OP_DzSwitchInfo" updated="07/19/23">
+ <opcode id="ffff" name="OP_DzSwitchInfo" updated="07/19/23">
<comment>Expedition compass etc</comment>
<payload dir="server" typename="dzSwitchInfo" sizechecktype="none"/>
</opcode>
- <opcode id="64ca" name="OP_DzInfo" updated="07/19/23">
+ <opcode id="ffff" name="OP_DzInfo" updated="07/19/23">
<comment>Expedition Information</comment>
<payload dir="server" typename="dzInfo" sizechecktype="match"/>
</opcode>
@@ -260,11 +260,11 @@
<comment>Environmental Damage</comment>
<payload dir="client" typename="environmentDamageStruct" sizechecktype="match"/>
</opcode>
- <opcode id="0d11" name="OP_SetRunMode" updated="07/19/23">
+ <opcode id="ffff" name="OP_SetRunMode" updated="07/19/23">
<comment>old cRunToggleCode</comment>
<payload dir="client" typename="cRunToggleStruct" sizechecktype="match"/>
</opcode>
- <opcode id="50f8" name="OP_Trader" updated="07/19/23">
+ <opcode id="ffff" name="OP_Trader" updated="07/19/23">
<comment>PC's turning trader on and off</comment>
<payload dir="server" typename="bazaarTraderRequest" sizechecktype="match"/>
</opcode>
@@ -307,15 +307,15 @@
<comment>List of group members - Variable length</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="4180" name="OP_GuildMemberList" updated="05/15/24">
+ <opcode id="705e" name="OP_GuildMemberList" updated="06/19/24">
<comment>List of guild members - Variable length</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="5a1b" name="OP_ManaUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_ManaUpdate" updated="07/19/23">
<comment>Mana Update opcode - 10 bytes</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="0349" name="OP_EndUpdate" updated="07/19/23">
+ <opcode id="ffff" name="OP_EndUpdate" updated="07/19/23">
<comment>Endurance Update opcode - 10 bytes</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
@@ -367,7 +367,7 @@
<comment>Fellowship information - 2576 bytes</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="1801" name="OP_ExpandedGuildInfo" updated="05/15/24">
+ <opcode id="ffff" name="OP_ExpandedGuildInfo" updated="05/15/24">
<comment>Guild ranks and other misc guild data - Variable length</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
@@ -535,11 +535,11 @@
<comment>Listing of all guilds. Can be triggered by /lfg search?</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2dbd" name="OP_GuildsInZoneList" updated="05/15/24">
+ <opcode id="7b05" name="OP_GuildsInZoneList" updated="06/19/24">
<comment>Listing of guild names present in the current zone. Generally seen on zoning</comment>
<payload dir="server" typename="guildsInZoneListStruct" sizechecktype="none"/>
</opcode>
- <opcode id="6bb1" name="OP_NewGuildInZone" updated="07/19/23">
+ <opcode id="ffff" name="OP_NewGuildInZone" updated="07/19/23">
<comment>An additional guild name has appeared in the current zone. Seen when a guilded player enters the current zone</comment>
<payload dir="server" typename="newGuildInZoneStruct" sizechecktype="none"/>
</opcode>
@@ -595,7 +595,7 @@
<comment>Free to play nags and other data - Variable length</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
- <opcode id="2c3b" name="OP_Find" updated="05/15/24">
+ <opcode id="238b" name="OP_Find" updated="06/19/24">
<comment>Find window data - 112 bytes</comment>
<payload dir="server" typename="uint8_t" sizechecktype="none"/>
</opcode>
Modified: showeq/branches/cn187_devel/configure.in
===================================================================
--- showeq/branches/cn187_devel/configure.in 2024-06-19 19:27:15 UTC (rev 1473)
+++ showeq/branches/cn187_devel/configure.in 2024-06-19 19:27:23 UTC (rev 1474)
@@ -2,7 +2,7 @@
dnl $Id$ $Name$
AC_PREREQ(2.59)
-AC_INIT(showeq, 6.3.14)
+AC_INIT(showeq, 6.3.15)
AC_CONFIG_SRCDIR(src/main.cpp)
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_SYSTEM
Modified: showeq/branches/cn187_devel/src/everquest.h
===================================================================
--- showeq/branches/cn187_devel/src/everquest.h 2024-06-19 19:27:15 UTC (rev 1473)
+++ showeq/branches/cn187_devel/src/everquest.h 2024-06-19 19:27:23 UTC (rev 1474)
@@ -1119,26 +1119,29 @@
struct
{
+ signed z:19; // z coord (3rd loc value)
+ unsigned pitch:12; // pitch (up/down heading)
+ unsigned padding00:1;
+
+ signed deltaHeading:10; // change in heading
+ signed y:19; // y coord (2nd loc value)
+ unsigned padding01:3;
+
signed x:19; // x coord (1st loc value)
- signed deltaZ:13; // change in z
+ unsigned heading:12; // heading
+ unsigned padding02:1;
- unsigned pitch:12; // pitch (up/down heading)
signed deltaX:13; // change in x
- unsigned pad1:7;
+ signed animation:10; // current animation
+ unsigned padding03:9;
signed deltaY:13; // change in y
- signed z:19; // z coord (3rd loc value)
+ signed deltaZ:13; // change in z
+ unsigned padding04:6;
- signed animation:10; // current animation
- signed deltaHeading:10; // change in heading
- unsigned pad3:12;
-
- signed y:19; // y coord (2nd loc value)
- unsigned heading:12; // heading
- unsigned pad4:1;
-
};
int32_t posData[5];
+
};
/*0000*/ union
@@ -2396,23 +2399,25 @@
/*0000*/ uint16_t spawnId;
/*0002*/ uint16_t spawnId2;
/*0004*/
- signed x:19; // x coord (1st loc value)
- signed deltaZ:13; // change in z
+ signed z:19; // z coord (3rd loc value)
+ unsigned pitch:12; // pitch (up/down heading)
+ unsigned padding00:1;
/*0008*/
- unsigned pitch:12; // pitch (up/down heading)
- signed deltaX:13; // change in x
- unsigned pad1:7;
+ signed deltaHeading:10; // change in heading
+ signed y:19; // y coord (2nd loc value)
+ unsigned padding01:3;
/*0012*/
- signed deltaY:13; // change in y
- signed z:19; // z coord (3rd loc value)
+ signed x:19; // x coord (1st loc value)
+ unsigned heading:12; // heading
+ unsigned padding02:1;
/*0016*/
+ signed deltaX:13; // change in x
signed animation:10; // current animation
- signed deltaHeading:10; // change in heading
- unsigned pad3:12;
+ unsigned padding03:9;
/*0020*/
- signed y:19; // y coord (2nd loc value)
- unsigned heading:12; // heading
- unsigned pad4:1;
+ signed deltaY:13; // change in y
+ signed deltaZ:13; // change in z
+ unsigned padding04:6;
/*0024*/
};
@@ -2427,25 +2432,25 @@
/*0002*/ uint16_t spawnId; // Player's spawn id
/*0004*/ uint16_t unknown0004; // ***Placeholder
/*0006*/
- float deltaZ; // change in z
+ signed animation:10; // current animation
+ unsigned pitch:12; // pitch (up/down heading)
+ unsigned padding00:10;
/*0010*/
- unsigned heading:12; // heading
- unsigned pitch:12; // pitch (up/down heading)
- unsigned pad1:8;
+ float deltaY; // change in y
/*0014*/
- float x; // x coord (1st loc value)
+ float deltaX; // change in x
/*0018*/
- signed deltaHeading:10; // change in heading
- signed animation:10; // current animation
- unsigned pad3:12;
+ float deltaZ; // change in z
/*0022*/
- float y; // y coord (2nd loc value)
+ float z; // z coord (3rd loc value)
/*0026*/
- float deltaY; // change in y
+ float x; // x coord (1st loc value)
/*0030*/
- float deltaX; // change in x
+ float y; // y coord (2nd loc value)
/*0034*/
- float z; // z coord (3rd loc value)
+ signed deltaHeading:10; // change in heading
+ unsigned heading:12; // heading
+ unsigned padding07:10;
/*0038*/
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-19 19:27:17
|
Revision: 1473
http://sourceforge.net/p/seq/svn/1473
Author: cn187
Date: 2024-06-19 19:27:15 +0000 (Wed, 19 Jun 2024)
Log Message:
-----------
Rework capture filter logic
- reduce code duplication
- fix bug with session detection when an IP address isn't specified
Modified Paths:
--------------
showeq/branches/cn187_devel/src/packet.cpp
showeq/branches/cn187_devel/src/packetcapture.cpp
showeq/branches/cn187_devel/src/packetcommon.h
Modified: showeq/branches/cn187_devel/src/packet.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packet.cpp 2024-06-19 19:22:47 UTC (rev 1472)
+++ showeq/branches/cn187_devel/src/packet.cpp 2024-06-19 19:27:15 UTC (rev 1473)
@@ -36,6 +36,7 @@
#include "everquest.h"
#include "packet.h"
+#include "packetcommon.h"
#include "packetcapture.h"
#include "packetformat.h"
#include "packetstream.h"
@@ -73,14 +74,6 @@
//----------------------------------------------------------------------
// constants
-const in_port_t WorldServerGeneralMinPort = 9000;
-const in_port_t WorldServerGeneralMaxPort = 9013;
-const in_port_t WorldServerChatPort = 9876;
-const in_port_t WorldServerChat2Port = 9875; // xgame tells, mail
-const in_port_t LoginServerMinPort = 15900;
-const in_port_t LoginServerMaxPort = 15910;
-const in_port_t ChatServerPort = 5998;
-
//----------------------------------------------------------------------
// Here begins the code
Modified: showeq/branches/cn187_devel/src/packetcapture.cpp
===================================================================
--- showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-19 19:22:47 UTC (rev 1472)
+++ showeq/branches/cn187_devel/src/packetcapture.cpp 2024-06-19 19:27:15 UTC (rev 1473)
@@ -31,6 +31,7 @@
#include <arpa/inet.h>
#include "packetcapture.h"
+#include "packetcommon.h"
#include "diagnosticmessages.h"
//#define PCAP_DEBUG 1
@@ -89,39 +90,8 @@
seqInfo("Initializing Packet Capture Thread: ");
m_pcache_closed = false;
- // Fetch the netmask for the device to use later with the filter.
- if (pcap_lookupnet(device, &net, &mask, ebuf) == -1)
- {
- // Couldn't find net mask. Just leave it open.
- seqWarn("Couldn't determine netmask of device %s. Using 0.0.0.0. Error was %s",
- device, ebuf);
- }
+ this->setFilter(device, host, realtime, address_type, 0, 0);
- // create pcap style filter expressions
- if (address_type == IP_ADDRESS_TYPE)
- {
- if (strcmp(host, AUTOMATIC_CLIENT_IP) == 0)
- {
- seqInfo("Filtering packets on device %s, searching for EQ client...", device);
- sprintf (filter_buf, "udp[0:2] > 1024 and udp[2:2] > 1024 and ether proto 0x0800 and not broadcast and not multicast");
- }
- else
- {
- seqInfo("Filtering packets on device %s, IP host %s", device, host);
- sprintf (filter_buf, "udp[0:2] > 1024 and udp[2:2] > 1024 and host %s and ether proto 0x0800 and not broadcast and not multicast", host);
- }
- }
- else if (address_type == MAC_ADDRESS_TYPE)
- {
- seqInfo("Filtering packets on device %s, MAC host %s", device, host);
- sprintf (filter_buf, "udp[0:2] > 1024 and udp[2:2] > 1024 and ether host %s and ether proto 0x0800 and not broadcast and not multicast", host);
- }
- else
- {
- seqFatal("pcap_error:filter_string: unknown address_type (%d)", address_type);
- exit(0);
- }
-
/* A word about pcap_open_live() from the docs
** to_ms specifies the read timeout in milliseconds. The
** read timeout is used to arrange that the read not necessarily
@@ -391,7 +361,8 @@
uint16_t zone_port,
uint16_t client_port)
{
- char filter_buf[256]; // pcap filter buffer
+ char filter_buf[256]; // pcap filter buffer
+ char* pfb = filter_buf;
char ebuf[PCAP_ERRBUF_SIZE];
struct bpf_program bpp;
struct sched_param sp;
@@ -406,51 +377,43 @@
device, ebuf);
}
- /* Listen to World Server or the specified Zone Server */
- if (address_type == IP_ADDRESS_TYPE && client_port)
+ if (!client_port && !zone_port)
{
- // Restrict to client port and ip, plus world streams.
- sprintf(filter_buf,
- "udp and (portrange 9000-9007 or port 9876 or port %d) and host %s and ether proto 0x0800 and not broadcast and not multicast",
- client_port, hostname);
+ //no client/zone port detected, so leave it open
+ pfb += sprintf(pfb, "udp[0:2] > 1024 and udp[2:2] > 1024");
}
- else if (address_type == IP_ADDRESS_TYPE && zone_port)
+ else
{
- // Restrict to zone port and world streams.
- sprintf(filter_buf,
- "udp and (portrange 9000-9007 or port 9876 or port %d) and host %s and ether proto 0x0800 and not broadcast and not multicast",
- zone_port, hostname);
+ // restrict to client/zone port and world server ports
+ pfb += sprintf(pfb, "udp");
+ pfb += sprintf(pfb, " and (portrange %d-%d or port %d or port %d)",
+ WorldServerGeneralMinPort, WorldServerGeneralMaxPort,
+ WorldServerChatPort, (client_port) ? client_port : zone_port);
}
- else if (address_type == MAC_ADDRESS_TYPE && client_port)
+
+ if (address_type == IP_ADDRESS_TYPE)
{
- // Restrict to client port and world streams.
- sprintf(filter_buf,
- "udp and (portrange 9000-9007 or port 9876 or port %d) and ether host %s and ether proto 0x0800 and not broadcast and not multicast",
- client_port, hostname);
+ if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
+ // host was specified/detected
+ pfb += sprintf(" and host %s", hostname);
}
- else if (address_type == MAC_ADDRESS_TYPE && zone_port)
+ else if (address_type == MAC_ADDRESS_TYPE)
{
- // Restrict to zone port and world streams.
- sprintf(filter_buf,
- "udp and (portrange 9000-9007 or port 9876 or port %d) and ether host %s and ether proto 0x0800 and not broadcast and not multicast",
- zone_port, hostname);
+ if (hostname && strcmp(hostname, AUTOMATIC_CLIENT_IP) != 0)
+ // mac was specified
+ pfb += sprintf(" and ether host %s", hostname);
}
- else if (hostname != NULL && !client_port && !zone_port)
- {
- // Leave wide open.
- sprintf(filter_buf,
- "udp[0:2] > 1024 and udp[2:2] > 1024 and ether proto 0x0800 and host %s and not broadcast and not multicast",
- hostname);
- }
else
{
- // Not even a hostname. Leave really wide open!
- seqInfo("Filtering packets on device %s, searching for EQ client...",
- device);
- sprintf(filter_buf,
- "udp[0:2] > 1024 and udp[2:2] > 1024 and ether proto 0x0800 and not broadcast and not multicast");
+ seqFatal("pcap_error:filter_string: unknown address_type (%d)", address_type);
+ exit(0);
}
+ //restrict to ipv4, and ignore broad/multi-cast packets
+ pfb += sprintf(pfb, " and ether proto 0x800 and not broadcast and not multicast");
+
+ seqInfo("Filtering packets on device %s", device);
+
if (pcap_compile (m_pcache_pcap, &bpp, filter_buf, 1, net) == -1)
{
seqWarn("%s",filter_buf);
Modified: showeq/branches/cn187_devel/src/packetcommon.h
===================================================================
--- showeq/branches/cn187_devel/src/packetcommon.h 2024-06-19 19:22:47 UTC (rev 1472)
+++ showeq/branches/cn187_devel/src/packetcommon.h 2024-06-19 19:27:15 UTC (rev 1473)
@@ -46,11 +46,20 @@
#include <endian.h>
#endif
+#include <netdb.h>
//----------------------------------------------------------------------
// Constants
const char* const AUTOMATIC_CLIENT_IP = "127.0.0.0";
+const in_port_t WorldServerGeneralMinPort = 9000;
+const in_port_t WorldServerGeneralMaxPort = 9015;
+const in_port_t WorldServerChatPort = 9876;
+const in_port_t WorldServerChat2Port = 9875; // xgame tells, mail
+const in_port_t LoginServerMinPort = 15900;
+const in_port_t LoginServerMaxPort = 15910;
+const in_port_t ChatServerPort = 5998;
+
// Preference constants for VPacket.Playback.
#define PLAYBACK_OFF 0
#define PLAYBACK_FORMAT_SEQ 1
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cn...@us...> - 2024-06-19 19:22:48
|
Revision: 1472
http://sourceforge.net/p/seq/svn/1472
Author: cn187
Date: 2024-06-19 19:22:47 +0000 (Wed, 19 Jun 2024)
Log Message:
-----------
Tag for release 6.3.15
Added Paths:
-----------
showeq/tags/v6_3_15/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|