ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/plugins.c
(Generate patch)

Comparing deliantra/server/server/plugins.c (file contents):
Revision 1.5 by elmex, Wed Feb 22 18:53:56 2006 UTC vs.
Revision 1.13 by elmex, Sat Aug 12 11:51:38 2006 UTC

1/* 1/*
2 * static char *rcsid_plugins_c = 2 * static char *rcsid_plugins_c =
3 * "$Id: plugins.c,v 1.5 2006/02/22 18:53:56 elmex Exp $"; 3 * "$Id: plugins.c,v 1.13 2006/08/12 11:51:38 elmex Exp $";
4 */ 4 */
5 5
6/*****************************************************************************/ 6/*****************************************************************************/
7/* CrossFire, A Multiplayer game for X-windows */ 7/* CrossFire, A Multiplayer game for X-windows */
8/* */ 8/* */
127 127
128/*****************************************************************************/ 128/*****************************************************************************/
129/* NEW PLUGIN STUFF STARTS HERE */ 129/* NEW PLUGIN STUFF STARTS HERE */
130/*****************************************************************************/ 130/*****************************************************************************/
131 131
132static void plugin_load_original_map(mapstruct *map)
133{
134 execute_global_event (EVENT_MAPLOAD, map);
135}
136
137static void plugin_load_temporary_map(mapstruct *map)
138{
139 execute_global_event (EVENT_MAPIN, map);
140}
141
142static void plugin_clean_temporary_map(mapstruct *map)
143{
144 execute_global_event (EVENT_MAPCLEAN, map);
145}
146
132static void plugin_object_free(object *ob) 147static void plugin_object_free(object *ob)
133{ 148{
134 execute_global_event (EVENT_FREE_OB, ob); 149 execute_global_event (EVENT_FREE_OB, ob);
135} 150}
136 151
257 free_object(tmp); 272 free_object(tmp);
258 } else { 273 } else {
259 int rvt = 0; 274 int rvt = 0;
260 int *rv; 275 int *rv;
261 276
262 rv = plugin->eventfunc(&rvt, op, eventcode, activator, third, message, fix, tmp->slaying, tmp->name); 277 rv = plugin->eventfunc(&rvt, op, eventcode, activator, third, message, fix, tmp->slaying, tmp->name, tmp);
263 return *rv; 278 return *rv;
264 } 279 }
265 } 280 }
266 } 281 }
267 } 282 }
271int execute_global_event(int eventcode, ...) 286int execute_global_event(int eventcode, ...)
272{ 287{
273 va_list args; 288 va_list args;
274 object* op; 289 object* op;
275 object* op2; 290 object* op2;
291 object* op3;
292 mapstruct *map;
276 player* pl; 293 player* pl;
277 char* buf; 294 char* buf;
278 int i, rt; 295 int i, rt, retval = 0, *tmpretval = NULL, fix;
279 crossfire_plugin* cp; 296 crossfire_plugin* cp;
280 if (plugins_list == NULL) 297 if (plugins_list == NULL)
281 return -1; 298 return -1;
282 299
283 va_start(args, eventcode); 300 va_start(args, eventcode);
289 case EVENT_TELL: 306 case EVENT_TELL:
290 /* no additional arguments */ 307 /* no additional arguments */
291 for (cp = plugins_list; cp != NULL; cp = cp->next) { 308 for (cp = plugins_list; cp != NULL; cp = cp->next) {
292 if (cp->gevent[eventcode] != NULL) 309 if (cp->gevent[eventcode] != NULL)
293 cp->gevent[eventcode](&rt, eventcode); 310 cp->gevent[eventcode](&rt, eventcode);
311 }
312 break;
313
314 case EVENT_PLAYER_LOAD:
315 case EVENT_PLAYER_SAVE:
316 /* object, filename */
317 op = va_arg(args, object*);
318 buf = va_arg(args, char*);
319 for (cp = plugins_list; cp != NULL; cp = cp->next) {
320 if (cp->gevent[eventcode] != NULL)
321 cp->gevent[eventcode](&rt, eventcode, op, buf);
322 }
323 break;
324
325 case EVENT_MAPLOAD:
326 case EVENT_MAPOUT:
327 case EVENT_MAPIN:
328 case EVENT_MAPCLEAN:
329 /* map argument */
330 map = va_arg(args, mapstruct*);
331 for (cp = plugins_list; cp != NULL; cp = cp->next) {
332 if (cp->gevent[eventcode] != NULL)
333 cp->gevent[eventcode](&rt, eventcode, map);
294 } 334 }
295 break; 335 break;
296 336
297 case EVENT_REMOVE: 337 case EVENT_REMOVE:
298 case EVENT_MAPENTER: 338 case EVENT_MAPENTER:
375 for (cp = plugins_list; cp != NULL; cp = cp->next) { 415 for (cp = plugins_list; cp != NULL; cp = cp->next) {
376 if (cp->gevent[eventcode] != NULL) 416 if (cp->gevent[eventcode] != NULL)
377 cp->gevent[eventcode](&rt, eventcode, op, buf); 417 cp->gevent[eventcode](&rt, eventcode, op, buf);
378 } 418 }
379 break; 419 break;
420
421 case EVENT_FIND_UNARMED_SKILL:
422 op = va_arg(args, object*);
423 for (cp = plugins_list; cp != NULL; cp = cp->next) {
424 if (cp->gevent[eventcode] != NULL)
425 if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op)) && *tmpretval > 0) {
426 retval = *tmpretval;
427 }
428 }
429 break;
430
431 case EVENT_PLAYER_USE_SKILL:
432 case EVENT_MONSTER_USE_SKILL:
433 op = va_arg(args, object*);
434 op2 = va_arg(args, object*);
435 op3 = va_arg(args, object*);
436 fix = va_arg(args, int);
437 buf = va_arg(args, char*);
438 for (cp = plugins_list; cp != NULL; cp = cp->next) {
439 if (cp->gevent[eventcode] != NULL)
440 if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op, op2, op3, fix, buf)) && *tmpretval != 0) {
441 retval = *tmpretval;
442 }
443 }
444 break;
445
446 case EVENT_CAST_SPELL:
447 op = va_arg(args, object*);
448 op2 = va_arg(args, object*);
449 op3 = va_arg(args, object*);
450 fix = va_arg(args, int);
451 buf = va_arg(args, char*);
452 for (cp = plugins_list; cp != NULL; cp = cp->next) {
453 if (cp->gevent[eventcode] != NULL)
454 if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op, op2, op3, fix, buf)) && *tmpretval != 0) {
455 retval = *tmpretval;
456 break; /* The first who did something wins! */
457 }
458 }
459 break;
460
461 case EVENT_EXTCMD:
462 /*KICK: op, parms*/
463 pl = va_arg (args, player *);
464 buf = va_arg (args, char *);
465 i = va_arg (args, int);
466 for (cp = plugins_list; cp != NULL; cp = cp->next) {
467 if (cp->gevent[eventcode] != NULL)
468 cp->gevent[eventcode](&rt, eventcode, pl, buf, i, buf);
469 }
470 break;
380 } 471 }
381 va_end(args); 472 va_end(args);
473
382 return 0; 474 return retval;
383} 475}
384 476
385int plugins_init_plugin(const char* libfile) 477int plugins_init_plugin(const char* libfile)
386{ 478{
387 LIBPTRTYPE ptr; 479 LIBPTRTYPE ptr;
392 f_plug_postinit closefunc; 484 f_plug_postinit closefunc;
393 int i; 485 int i;
394 crossfire_plugin* cp; 486 crossfire_plugin* cp;
395 crossfire_plugin* ccp; 487 crossfire_plugin* ccp;
396 488
489 load_original_map_callback = plugin_load_original_map;
490 load_temporary_map_callback = plugin_load_temporary_map;
491 clean_temporary_map_callback = plugin_clean_temporary_map;
397 object_free_callback = plugin_object_free; 492 object_free_callback = plugin_object_free;
398 493
399 /* Open the plugin lib and load the required functions */ 494 /* Open the plugin lib and load the required functions */
400 ptr = plugins_dlopen(libfile); 495 ptr = plugins_dlopen(libfile);
401 if (ptr == NULL) { 496 if (ptr == NULL) {
1364 rv = op->map; 1459 rv = op->map;
1365 *type = CFAPI_PMAP; 1460 *type = CFAPI_PMAP;
1366 break; 1461 break;
1367 1462
1368 case CFAPI_OBJECT_PROP_COUNT: 1463 case CFAPI_OBJECT_PROP_COUNT:
1369 rv = &op->count; 1464 ri = op->count; rv = &ri;
1370 *type = CFAPI_INT; 1465 *type = CFAPI_INT;
1371 break; 1466 break;
1372 1467
1373 case CFAPI_OBJECT_PROP_REFCOUNT: 1468 case CFAPI_OBJECT_PROP_REFCOUNT:
1374 rv = &op->refcount; 1469 ri = op->refcount; rv = &ri;
1375 *type = CFAPI_INT; 1470 *type = CFAPI_INT;
1376 break; 1471 break;
1377 1472
1378 case CFAPI_OBJECT_PROP_NAME: 1473 case CFAPI_OBJECT_PROP_NAME:
1379 rv = query_name(op); 1474 rv = query_name(op);
1438 rv = &op->speed_left; 1533 rv = &op->speed_left;
1439 *type = CFAPI_DOUBLE; 1534 *type = CFAPI_DOUBLE;
1440 break; 1535 break;
1441 1536
1442 case CFAPI_OBJECT_PROP_NROF: 1537 case CFAPI_OBJECT_PROP_NROF:
1443 rv = &op->nrof; 1538 ri = op->nrof; rv = &ri;
1444 *type = CFAPI_INT; 1539 *type = CFAPI_INT;
1445 break; 1540 break;
1446 1541
1447 case CFAPI_OBJECT_PROP_DIRECTION: 1542 case CFAPI_OBJECT_PROP_DIRECTION:
1448 rv = &op->direction; 1543 ri = op->direction; rv = &ri;
1449 *type = CFAPI_INT; 1544 *type = CFAPI_INT;
1450 break; 1545 break;
1451 1546
1452 case CFAPI_OBJECT_PROP_FACING: 1547 case CFAPI_OBJECT_PROP_FACING:
1453 rv = &op->facing; 1548 ri = op->facing; rv = &ri;
1454 *type = CFAPI_INT; 1549 *type = CFAPI_INT;
1455 break; 1550 break;
1456 1551
1457 case CFAPI_OBJECT_PROP_TYPE: 1552 case CFAPI_OBJECT_PROP_TYPE:
1458 rv = &op->type; 1553 ri = op->type; rv = &ri;
1459 *type = CFAPI_INT; 1554 *type = CFAPI_INT;
1460 break; 1555 break;
1461 1556
1462 case CFAPI_OBJECT_PROP_SUBTYPE: 1557 case CFAPI_OBJECT_PROP_SUBTYPE:
1463 rv = &op->subtype; 1558 ri = op->subtype; rv = &ri;
1464 *type = CFAPI_INT; 1559 *type = CFAPI_INT;
1465 break; 1560 break;
1466 1561
1467 case CFAPI_OBJECT_PROP_CLIENT_TYPE: 1562 case CFAPI_OBJECT_PROP_CLIENT_TYPE:
1468 rv = &op->client_type; 1563 ri = op->client_type; rv = &ri;
1469 *type = CFAPI_INT; 1564 *type = CFAPI_INT;
1470 break; 1565 break;
1471 1566
1472 case CFAPI_OBJECT_PROP_RESIST: 1567 case CFAPI_OBJECT_PROP_RESIST:
1473 { 1568 {
1474 int idx; 1569 int idx;
1475 idx = va_arg(args, int); 1570 idx = va_arg(args, int);
1476 rv = &op->resist[idx]; 1571 ri = op->resist[idx]; rv = &ri;
1477 } 1572 }
1478 *type = CFAPI_INT16; 1573 *type = CFAPI_INT;
1479 break; 1574 break;
1480 1575
1481 case CFAPI_OBJECT_PROP_ATTACK_TYPE: 1576 case CFAPI_OBJECT_PROP_ATTACK_TYPE:
1482 rv = &op->attacktype; 1577 ri = op->attacktype; rv = &ri;
1483 *type = CFAPI_INT; 1578 *type = CFAPI_INT;
1484 break; 1579 break;
1485 1580
1486 case CFAPI_OBJECT_PROP_PATH_ATTUNED: 1581 case CFAPI_OBJECT_PROP_PATH_ATTUNED:
1487 rv = &op->path_attuned; 1582 ri = op->path_attuned; rv = &ri;
1488 *type = CFAPI_INT; 1583 *type = CFAPI_INT;
1489 break; 1584 break;
1490 1585
1491 case CFAPI_OBJECT_PROP_PATH_REPELLED: 1586 case CFAPI_OBJECT_PROP_PATH_REPELLED:
1492 rv = &op->path_repelled; 1587 ri = op->path_repelled; rv = &ri;
1493 *type = CFAPI_INT; 1588 *type = CFAPI_INT;
1494 break; 1589 break;
1495 1590
1496 case CFAPI_OBJECT_PROP_PATH_DENIED: 1591 case CFAPI_OBJECT_PROP_PATH_DENIED:
1497 rv = &op->path_denied; 1592 ri = op->path_denied; rv = &ri;
1498 *type = CFAPI_INT; 1593 *type = CFAPI_INT;
1499 break; 1594 break;
1500 1595
1501 case CFAPI_OBJECT_PROP_MATERIAL: 1596 case CFAPI_OBJECT_PROP_MATERIAL:
1502 rv = &op->material; 1597 ri = op->material; rv = &ri;
1503 *type = CFAPI_INT; 1598 *type = CFAPI_INT;
1504 break; 1599 break;
1505 1600
1506 case CFAPI_OBJECT_PROP_MATERIAL_NAME: 1601 case CFAPI_OBJECT_PROP_MATERIAL_NAME:
1507 rv = (char*)op->materialname; 1602 rv = (char*)op->materialname;
1508 *type = CFAPI_STRING; 1603 *type = CFAPI_STRING;
1509 break; 1604 break;
1510 1605
1511 case CFAPI_OBJECT_PROP_MAGIC: 1606 case CFAPI_OBJECT_PROP_MAGIC:
1512 rv = &op->magic; 1607 ri = op->magic; rv = &ri;
1513 *type = CFAPI_INT; 1608 *type = CFAPI_INT;
1514 break; 1609 break;
1515 1610
1516 case CFAPI_OBJECT_PROP_VALUE: 1611 case CFAPI_OBJECT_PROP_VALUE:
1517 rv = &op->value; 1612 ri = op->value; rv = &ri;
1518 *type = CFAPI_INT; 1613 *type = CFAPI_INT;
1519 break; 1614 break;
1520 1615
1521 case CFAPI_OBJECT_PROP_LEVEL: 1616 case CFAPI_OBJECT_PROP_LEVEL:
1522 rv = &op->level; 1617 ri = op->level; rv = &ri;
1523 *type = CFAPI_INT; 1618 *type = CFAPI_INT;
1524 break; 1619 break;
1525 1620
1526 case CFAPI_OBJECT_PROP_LAST_HEAL: 1621 case CFAPI_OBJECT_PROP_LAST_HEAL:
1527 rv = &op->last_heal; 1622 ri = op->last_heal; rv = &ri;
1528 *type = CFAPI_INT; 1623 *type = CFAPI_INT;
1529 break; 1624 break;
1530 1625
1531 case CFAPI_OBJECT_PROP_LAST_SP: 1626 case CFAPI_OBJECT_PROP_LAST_SP:
1532 rv = &op->last_sp; 1627 ri = op->last_sp; rv = &ri;
1533 *type = CFAPI_INT; 1628 *type = CFAPI_INT;
1534 break; 1629 break;
1535 1630
1536 case CFAPI_OBJECT_PROP_LAST_GRACE: 1631 case CFAPI_OBJECT_PROP_LAST_GRACE:
1537 rv = &op->last_grace; 1632 ri = op->last_grace; rv = &ri;
1538 *type = CFAPI_INT; 1633 *type = CFAPI_INT;
1539 break; 1634 break;
1540 1635
1541 case CFAPI_OBJECT_PROP_LAST_EAT: 1636 case CFAPI_OBJECT_PROP_LAST_EAT:
1542 rv = &op->last_eat; 1637 ri = op->last_eat; rv = &ri;
1543 *type = CFAPI_INT; 1638 *type = CFAPI_INT;
1544 break; 1639 break;
1545 1640
1546 case CFAPI_OBJECT_PROP_INVISIBLE_TIME: 1641 case CFAPI_OBJECT_PROP_INVISIBLE_TIME:
1547 rv = &op->invisible; 1642 ri = op->invisible; rv = &ri;
1548 *type = CFAPI_INT; 1643 *type = CFAPI_INT;
1549 break; 1644 break;
1550 1645
1551 case CFAPI_OBJECT_PROP_PICK_UP: 1646 case CFAPI_OBJECT_PROP_PICK_UP:
1552 rv = &op->pick_up; 1647 ri = op->pick_up; rv = &ri;
1553 *type = CFAPI_INT; 1648 *type = CFAPI_INT;
1554 break; 1649 break;
1555 1650
1556 case CFAPI_OBJECT_PROP_ITEM_POWER: 1651 case CFAPI_OBJECT_PROP_ITEM_POWER:
1557 rv = &op->item_power; 1652 ri = op->item_power; rv = &ri;
1558 *type = CFAPI_INT; 1653 *type = CFAPI_INT;
1559 break; 1654 break;
1560 1655
1561 case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR: 1656 case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR:
1562 rv = &op->gen_sp_armour; 1657 ri = op->gen_sp_armour; rv = &ri;
1563 *type = CFAPI_INT; 1658 *type = CFAPI_INT;
1564 break; 1659 break;
1565 1660
1566 case CFAPI_OBJECT_PROP_WEIGHT: 1661 case CFAPI_OBJECT_PROP_WEIGHT:
1567 rv = &op->weight; 1662 ri = op->weight; rv = &ri;
1568 *type = CFAPI_INT; 1663 *type = CFAPI_INT;
1569 break; 1664 break;
1570 1665
1571 case CFAPI_OBJECT_PROP_WEIGHT_LIMIT: 1666 case CFAPI_OBJECT_PROP_WEIGHT_LIMIT:
1572 rv = &op->weight_limit; 1667 ri = op->weight_limit; rv = &ri;
1573 *type = CFAPI_INT; 1668 *type = CFAPI_INT;
1574 break; 1669 break;
1575 1670
1576 case CFAPI_OBJECT_PROP_CARRYING: 1671 case CFAPI_OBJECT_PROP_CARRYING:
1577 rv = &op->carrying; 1672 ri = op->carrying; rv = &ri;
1578 *type = CFAPI_INT; 1673 *type = CFAPI_INT;
1579 break; 1674 break;
1580 1675
1581 case CFAPI_OBJECT_PROP_GLOW_RADIUS: 1676 case CFAPI_OBJECT_PROP_GLOW_RADIUS:
1582 rv = &op->glow_radius; 1677 ri = op->glow_radius; rv = &ri;
1583 *type = CFAPI_INT; 1678 *type = CFAPI_INT;
1584 break; 1679 break;
1585 1680
1586 case CFAPI_OBJECT_PROP_PERM_EXP: 1681 case CFAPI_OBJECT_PROP_PERM_EXP:
1587 rv = &op->perm_exp; 1682 rv = &op->perm_exp;
1602 rv = op->attacked_by; 1697 rv = op->attacked_by;
1603 *type = CFAPI_POBJECT; 1698 *type = CFAPI_POBJECT;
1604 break; 1699 break;
1605 1700
1606 case CFAPI_OBJECT_PROP_RUN_AWAY: 1701 case CFAPI_OBJECT_PROP_RUN_AWAY:
1607 rv = &op->run_away; 1702 ri = op->run_away; rv = &ri;
1608 *type = CFAPI_INT; 1703 *type = CFAPI_INT;
1609 break; 1704 break;
1610 1705
1611 case CFAPI_OBJECT_PROP_CHOSEN_SKILL: 1706 case CFAPI_OBJECT_PROP_CHOSEN_SKILL:
1612 rv = op->chosen_skill; 1707 rv = op->chosen_skill;
1613 *type = CFAPI_POBJECT; 1708 *type = CFAPI_POBJECT;
1614 break; 1709 break;
1615 1710
1616 case CFAPI_OBJECT_PROP_HIDDEN: 1711 case CFAPI_OBJECT_PROP_HIDDEN:
1617 rv = &op->hide; 1712 ri = op->hide; rv = &ri;
1618 *type = CFAPI_INT; 1713 *type = CFAPI_INT;
1619 break; 1714 break;
1620 1715
1621 case CFAPI_OBJECT_PROP_MOVE_STATUS: 1716 case CFAPI_OBJECT_PROP_MOVE_STATUS:
1622 rv = &op->move_status; 1717 ri = op->move_status; rv = &ri;
1623 *type = CFAPI_INT; 1718 *type = CFAPI_INT;
1624 break; 1719 break;
1625 1720
1626 case CFAPI_OBJECT_PROP_MOVE_TYPE: 1721 case CFAPI_OBJECT_PROP_MOVE_TYPE:
1627 rv = &op->attack_movement; 1722 ri = op->attack_movement; rv = &ri;
1628 *type = CFAPI_INT; 1723 *type = CFAPI_INT;
1629 break; 1724 break;
1630 1725
1631 case CFAPI_OBJECT_PROP_SPELL_ITEM: 1726 case CFAPI_OBJECT_PROP_SPELL_ITEM:
1632 rv = op->spellitem; 1727 rv = op->spellitem;
1652 rv = (char*)op->custom_name; 1747 rv = (char*)op->custom_name;
1653 *type = CFAPI_STRING; 1748 *type = CFAPI_STRING;
1654 break; 1749 break;
1655 1750
1656 case CFAPI_OBJECT_PROP_ANIM_SPEED: 1751 case CFAPI_OBJECT_PROP_ANIM_SPEED:
1657 rv = &op->anim_speed; 1752 ri = op->anim_speed; rv = &ri;
1658 *type = CFAPI_INT; 1753 *type = CFAPI_INT;
1659 break; 1754 break;
1660 1755
1661 case CFAPI_OBJECT_PROP_FRIENDLY: 1756 case CFAPI_OBJECT_PROP_FRIENDLY:
1662 ri = is_friendly(op); 1757 ri = is_friendly(op);
1683 rv = &ri; 1778 rv = &ri;
1684 *type = CFAPI_INT; 1779 *type = CFAPI_INT;
1685 break; 1780 break;
1686 1781
1687 case CFAPI_OBJECT_PROP_LUCK: 1782 case CFAPI_OBJECT_PROP_LUCK:
1688 rv = &op->stats.luck; 1783 ri = op->stats.luck; rv = &ri;
1689 *type = CFAPI_INT; 1784 *type = CFAPI_INT;
1690 break; 1785 break;
1691 1786
1692 case CFAPI_OBJECT_PROP_EXP: 1787 case CFAPI_OBJECT_PROP_EXP:
1693 rv = &op->stats.exp; 1788 rv = &op->stats.exp;
1730 *type = CFAPI_POBJECT; 1825 *type = CFAPI_POBJECT;
1731 break; 1826 break;
1732 1827
1733 case CFAPI_OBJECT_PROP_CHEATER: 1828 case CFAPI_OBJECT_PROP_CHEATER:
1734 ri = (QUERY_FLAG(op, FLAG_WAS_WIZ)); 1829 ri = (QUERY_FLAG(op, FLAG_WAS_WIZ));
1830 rv = &ri;
1735 *type = CFAPI_INT; 1831 *type = CFAPI_INT;
1736 break; 1832 break;
1737 1833
1738 case CFAPI_OBJECT_PROP_MERGEABLE: 1834 case CFAPI_OBJECT_PROP_MERGEABLE:
1739 { 1835 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines